跳转至

3353. 最小总操作数 🔒

题目描述

给定一个整数数组 nums,你可以在这个数组上进行 任意 次操作。

在每次 操作 中,你可以:

  • 选择这个数组的一个 前缀
  • 选择一个整数 k(可以为负)并且对选中前缀的每一个元素加 k

数组的 前缀 是一个子数组,从数组的开头开始并延伸到数组内的任何位置。

返回使 arr 中的所有元素都相等的 最小 操作数。

 

示例 1:

输入:nums = [1,4,2]

输出:2

解释:

  • 操作 1:选择长度为 2 的前缀 [1, 4] 并且对其中的所有元素加 -2。数组变为 [-1, 2, 2]
  • 操作 2:选择长度为 1 的前缀 [-1] 并且对其中的所有元素加 3。数组变为 [2, 2, 2]
  • 因此,所需的最小操作数为 2。

示例 2:

输入:nums = [10,10,10]

输出:0

解释:

  • 所有元素已经相等,所以不需要操作。

 

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

解法

方法一:一次遍历

我们可以遍历数组,对于每个元素,如果它与前一个元素不相等,那么就需要进行一次操作,最后返回操作的次数即可。

时间复杂度 $O(n)$,其中 $n$ 为数组的长度。空间复杂度 $O(1)$。

1
2
3
class Solution:
    def minOperations(self, nums: List[int]) -> int:
        return sum(x != y for x, y in pairwise(nums))
1
2
3
4
5
6
7
8
9
class Solution {
    public int minOperations(int[] nums) {
        int ans = 0;
        for (int i = 1; i < nums.length; ++i) {
            ans += nums[i] != nums[i - 1] ? 1 : 0;
        }
        return ans;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution {
public:
    int minOperations(vector<int>& nums) {
        int ans = 0;
        for (int i = 1; i < nums.size(); ++i) {
            ans += nums[i] != nums[i - 1];
        }
        return ans;
    }
};
1
2
3
4
5
6
7
8
func minOperations(nums []int) (ans int) {
    for i, x := range nums[1:] {
        if x != nums[i] {
            ans++
        }
    }
    return
}
1
2
3
4
5
6
7
function minOperations(nums: number[]): number {
    let ans = 0;
    for (let i = 1; i < nums.length; ++i) {
        ans += nums[i] !== nums[i - 1] ? 1 : 0;
    }
    return ans;
}

评论