## Description You are given two 0-indexed arrays nums and cost consisting each of n positive integers. You can do the following operation any number of times: Increase or decrease any element of the array nums by 1. The cost of doing one operation on the ith element is cost[i]. Return the minimum total cost such that all the elements of the array nums become equal. - Example 1: >Input: nums = [1,3,5,2], cost = [2,3,1,14] Output: 8 >>Explanation: We can make all the elements equal to 2 in the following way: - Increase the 0th element one time. The cost is 2. - Decrease the 1st element one time. The cost is 3. - Decrease the 2nd element three times. The cost is 1 + 1 + 1 = 3. The total cost is 2 + 3 + 3 = 8. It can be shown that we cannot make the array equal with a smaller cost. - Example 2: >Input: nums = [2,2,2,2,2], cost = [4,2,8,1,3] Output: 0 >>Explanation: All the elements are already equal, so no operations are needed. - Constraints: >n == nums.length == cost.length 1 <= n <= 105 1 <= nums[i], cost[i] <= 106 ## Solution - The problem is difficult to find a suitable algorithm to solve. But if we think intuitively, the problem is related to a `curve` of final modification when it comes to change different target value - Consequently, the answer should be the smallest one in the curve - Because we need to find the finite gap between the possible solution to construct the curve, find the largest and smallest value in the array ```cpp= int minele = INT_MAX, mxele = INT_MIN, mid; for (auto &i : nums) { minele = min(minele, i); mxele = max(mxele, i); } ``` - For finding the true value, we can use binary search and narrow down the possible gap for answer - For each iteration, calculate the current solution for the middle target ```cpp= mid = minele + (mxele - minele) / 2; temp = find_cost(nums, cost, mid); ans = min(ans, temp); ``` - For changing to smaller gap, calculate the ones on the left and right. Use the smaller one as the target gap in the next iteration ```cpp= r = find_cost(nums, cost, mid + 1); l = find_cost(nums, cost, mid - 1); if(temp < l && temp < r) return ans; else if(temp < l && temp > r) minele = mid + 1; else mxele = mid - 1; ```