Array Sum up increment. 1526, 3229

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;
    }
}

 

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;
    }
}

 

posted @ 2024-07-22 09:24  xiaoyongyong  阅读(4)  评论(0编辑  收藏  举报