Array Sum up increment. 1526, 3229

xiaoyongyong發表於2024-07-22

1526. Minimum Number of Increments on Subarrays to Form a Target Array

You are given an integer array target. You have an integer array initial of the same size as target with all elements initially zeros.

In one operation you can choose any subarray from initial and increment each value by one.

Return the minimum number of operations to form a target array from initial.

The test cases are generated so that the answer fits in a 32-bit integer.

Example 1:

Input: target = [1,2,3,2,1]
Output: 3
Explanation: We need at least 3 operations to form the target array from the initial array.
[0,0,0,0,0] increment 1 from index 0 to 4 (inclusive).
[1,1,1,1,1] increment 1 from index 1 to 3 (inclusive).
[1,2,2,2,1] increment 1 at index 2.
[1,2,3,2,1] target array is formed.

Example 2:

Input: target = [3,1,1,2]
Output: 4
Explanation: [0,0,0,0] -> [1,1,1,1] -> [1,1,1,2] -> [2,1,1,2] -> [3,1,1,2]

Example 3:

Input: target = [3,1,5,4,2]
Output: 7
Explanation: [0,0,0,0,0] -> [1,1,1,1,1] -> [2,1,1,1,1] -> [3,1,1,1,1] -> [3,1,2,2,2] -> [3,1,3,3,2] -> [3,1,4,4,2] -> [3,1,5,4,2]. 

Constraints:

  • 1 <= target.length <= 105
  • 1 <= target[i] <= 105
/**
1,2,3,2,1
^
result = 1

1,2,3,2,1
  ^
2比1需要額外的1個cost, 因此:
result = 1 + 1

1,2,3,2,1
    ^
3比2需要額外的1個cost,因此:
result = 1 + 1 + 1

1,2,3,2,1
      ^
2比3小,因此3的cost已經足以cover2,因此
result = 1 + 1 + 1 + 0

1,2,3,2,1
        ^
1比2小,因此2的cost已經足以cover 1,因此
result = 1 + 1 + 1 + 0 + 0

答案: 3

 */

class Solution {
    public int minNumberOperations(int[] target) {
        int result = target[0];
        for(int i = 1; i < target.length; i++) {
            if(target[i] > target[i - 1]) result += target[i] - target[i - 1];
        }
        return result;
    }
}

3229. Minimum Operations to Make Array Equal to Target
You are given two positive integer arrays nums and target, of the same length. In a single operation, you can select any subarray
of nums and increment or decrement each element within that subarray by 1.

Return the minimum number of operations required to make nums equal to the array target.

Example 1:

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

Output: 2

Explanation:

We will perform the following operations to make nums equal to target:
- Increment nums[0..3] by 1, nums = [4,6,2,3].
- Increment nums[3..3] by 1, nums = [4,6,2,4].

Example 2:

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

Output: 5

Explanation:

We will perform the following operations to make nums equal to target:
- Increment nums[0..0] by 1, nums = [2,3,2].
- Decrement nums[1..1] by 1, nums = [2,2,2].
- Decrement nums[1..1] by 1, nums = [2,1,2].
- Increment nums[2..2] by 1, nums = [2,1,3].
- Increment nums[2..2] by 1, nums = [2,1,4].

Constraints:

  • 1 <= nums.length == target.length <= 105
  • 1 <= nums[i], target[i] <= 108
class Solution {
    /**
    思路:
        1. 計算兩個陣列差值,最終的答案就是將差值陣列全部變成0的過程
        2. 將差值序列操作後變為全0,我們可以將正負數分開處理
            如果x>y, 那麼x在y cost基礎上,需要x-y的額外cost才能變成0, 
            如果x<y, 那麼x不需要額外cost
     */
    public long minimumOperations(int[] nums, int[] target) {
        // 計算差值
        int[] diff = new int[nums.length];
        for(int i = 0; i < nums.length; i++) {
            diff[i] = target[i] - nums[i];
        }
 
        // 
        long result = Math.abs(diff[0]);
        for(int i = 1; i < diff.length; i++) {
            // 如果都為正
            if(diff[i - 1] >= 0 &&  diff[i] >= 0) {
                if(diff[i - 1] < diff[i]) {
                    result += diff[i] - diff[i - 1];
                }
            }
            // 如果都為負
            else if(diff[i - 1] <= 0 &&  diff[i] <= 0) {
                if(diff[i - 1] > diff[i]) {
                    result += diff[i - 1] - diff[i];
                }
            }
            // 如果方向切換,證明從負->正,或者從正->負, 將當前起始差值加進去
            else {
                result += Math.abs(diff[i]);
            }
        }
        return result;
    }
}