comments | difficulty | edit_url | tags | |
---|---|---|---|---|
true |
简单 |
|
给定一个整数数组 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
我们可以遍历数组,对于每个元素,如果它与前一个元素不相等,那么就需要进行一次操作,最后返回操作的次数即可。
时间复杂度
class Solution:
def minOperations(self, nums: List[int]) -> int:
return sum(x != y for x, y in pairwise(nums))
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;
}
}
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;
}
};
func minOperations(nums []int) (ans int) {
for i, x := range nums[1:] {
if x != nums[i] {
ans++
}
}
return
}
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;
}