LeetCode-in-Java

2449. Minimum Number of Operations to Make Arrays Similar

Hard

You are given two positive integer arrays nums and target, of the same length.

In one operation, you can choose any two distinct indices i and j where 0 <= i, j < nums.length and:

Two arrays are considered to be similar if the frequency of each element is the same.

Return the minimum number of operations required to make nums similar to target. The test cases are generated such that nums can always be similar to target.

Example 1:

Input: nums = [8,12,6], target = [2,14,10]

Output: 2

Explanation: It is possible to make nums similar to target in two operations:

It can be shown that 2 is the minimum number of operations needed.

Example 2:

Input: nums = [1,2,5], target = [4,1,3]

Output: 1

Explanation: We can make nums similar to target in one operation: - Choose i = 1 and j = 2, nums = [1,4,3].

Example 3:

Input: nums = [1,1,1,1,1], target = [1,1,1,1,1]

Output: 0

Explanation: The array nums is already similiar to target.

Constraints:

Solution

import java.util.ArrayList;
import java.util.Arrays;

@SuppressWarnings("java:S2184")
public class Solution {
    public long makeSimilar(int[] nums, int[] target) {
        ArrayList<Integer> evenNums = new ArrayList<>();
        ArrayList<Integer> oddNums = new ArrayList<>();
        ArrayList<Integer> evenTar = new ArrayList<>();
        ArrayList<Integer> oddTar = new ArrayList<>();
        Arrays.sort(nums);
        Arrays.sort(target);
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] % 2 == 0) {
                evenNums.add(nums[i]);
            } else {
                oddNums.add(nums[i]);
            }
            if (target[i] % 2 == 0) {
                evenTar.add(target[i]);
            } else {
                oddTar.add(target[i]);
            }
        }
        long countPositiveIteration = 0;
        long countNegativeIteration = 0;
        for (int i = 0; i < evenNums.size(); i++) {
            int num = evenNums.get(i);
            int tar = evenTar.get(i);
            long diff = (long) num - tar;
            long iteration = diff / 2;
            if (diff > 0) {
                countNegativeIteration += iteration;
            } else if (diff < 0) {
                countPositiveIteration += Math.abs(iteration);
            }
        }
        for (int i = 0; i < oddNums.size(); i++) {
            int num = oddNums.get(i);
            int tar = oddTar.get(i);
            long diff = (long) num - tar;
            long iteration = diff / 2;
            if (diff > 0) {
                countNegativeIteration += iteration;
            } else if (diff < 0) {
                countPositiveIteration += Math.abs(iteration);
            }
        }
        long totalDifference = countPositiveIteration - countNegativeIteration;
        return totalDifference == 0
                ? countPositiveIteration
                : countPositiveIteration + Math.abs(totalDifference);
    }
}