Skip to content

Latest commit

 

History

History
153 lines (109 loc) · 3.74 KB

File metadata and controls

153 lines (109 loc) · 3.74 KB
comments difficulty edit_url tags
true
简单
数组

English Version

题目描述

给定一个整数数组 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)$

Python3

class Solution:
    def minOperations(self, nums: List[int]) -> int:
        return sum(x != y for x, y in pairwise(nums))

Java

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

C++

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

Go

func minOperations(nums []int) (ans int) {
	for i, x := range nums[1:] {
		if x != nums[i] {
			ans++
		}
	}
	return
}

TypeScript

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