Easy
题目描述
给你一个整数数组 nums。考虑以下操作:
- 删除数组的前两个元素,并将这两个元素的和定义为操作的分数。
你可以执行此操作,直到 nums 包含少于两个元素。此外,所有操作必须获得相同的分数。
返回你可以执行的最大操作数。
示例 1:
输入:nums = [3,2,1,4,5]
输出:2
解释:
- 我们可以执行第一次操作,分数为 3 + 2 = 5。操作后,nums = [1,4,5]。
- 我们可以执行第二次操作,分数为 4 + 1 = 5,与前一次操作相同。操作后,nums = [5]。
- 由于元素少于两个,我们无法执行更多操作。
示例 2:
输入:nums = [1,5,3,3,4,1,3,2,2,3]
输出:2
解释:
- 我们可以执行第一次操作,分数为 1 + 5 = 6。操作后,nums = [3,3,4,1,3,2,2,3]。
- 我们可以执行第二次操作,分数为 3 + 3 = 6,与前一次操作相同。操作后,nums = [4,1,3,2,2,3]。
- 我们无法执行下一次操作,因为分数为 4 + 1 = 5,与前面的分数不同。
示例 3:
输入:nums = [5,3]
输出:1
提示:
2 <= nums.length <= 1001 <= nums[i] <= 1000
解题思路
解题思路
这是一道模拟题,关键在于理解题目要求:每次操作都必须删除数组的前两个元素,且所有操作的分数(前两个元素之和)必须相同。
思路分析:
- 确定目标分数:第一次操作的分数就是我们的目标分数,即
nums[0] + nums[1] - 逐步验证:从数组开头开始,每次取前两个元素计算分数,如果等于目标分数则继续,否则停止
- 统计操作次数:记录成功执行的操作次数
算法步骤:
- 计算目标分数:
target = nums[0] + nums[1] - 使用指针
i从位置 0 开始,每次检查nums[i] + nums[i+1]是否等于目标分数 - 如果相等,操作次数加1,指针向后移动2位
- 如果不等或数组剩余元素不足2个,停止操作
这个解法的时间复杂度是 O(n),空间复杂度是 O(1),非常高效。
代码实现
class Solution {
public:
int maxOperations(vector<int>& nums) {
int target = nums[0] + nums[1];
int operations = 0;
for (int i = 0; i + 1 < nums.size(); i += 2) {
if (nums[i] + nums[i + 1] == target) {
operations++;
} else {
break;
}
}
return operations;
}
};
class Solution:
def maxOperations(self, nums: List[int]) -> int:
target = nums[0] + nums[1]
operations = 0
i = 0
while i + 1 < len(nums):
if nums[i] + nums[i + 1] == target:
operations += 1
i += 2
else:
break
return operations
public class Solution {
public int MaxOperations(int[] nums) {
int target = nums[0] + nums[1];
int operations = 0;
for (int i = 0; i + 1 < nums.Length; i += 2) {
if (nums[i] + nums[i + 1] == target) {
operations++;
} else {
break;
}
}
return operations;
}
}
var maxOperations = function(nums) {
const target = nums[0] + nums[1];
let operations = 0;
for (let i = 0; i + 1 < nums.length; i += 2) {
if (nums[i] + nums[i + 1]
复杂度分析
| 复杂度 | 分析 |
|---|---|
| 时间复杂度 | O(n),其中 n 是数组长度。最坏情况下需要遍历整个数组 |
| 空间复杂度 | O(1),只使用常数额外空间 |