说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
给你一个整数数组 nums
,如果 nums
至少 包含 2
个元素,你可以执行以下操作:
- 选择
nums
中的前两个元素并将它们删除。
一次操作的 分数 是被删除元素的和。
在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。
请你返回按照上述要求 最多 可以进行的操作次数。
示例 1:
输入: nums = [3,2,1,4,5] 输出: 2 解释: 我们执行以下操作: - 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,4,5] 。 - 删除前两个元素,分数为 1 + 4 = 5 ,nums = [5] 。 由于只剩下 1 个元素,我们无法继续进行任何操作。
示例 2:
输入: nums = [3,2,6,1,4] 输出: 1 解释: 我们执行以下操作: - 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。 由于下一次操作的分数与前一次不相等,我们无法继续进行任何操作。
提示:
2 <= nums.length <= 100
1 <= nums[i] <= 1000
解题思路
首先判断给定的数组 nums 的长度是否小于 2,如果是,则直接返回 0。接着计算数组中前两个元素的和 sum,初始化变量 i 和 cnt,分别表示当前遍历的索引和满足条件的元素对数量。
然后进入 while 循环,条件是 i 小于数组长度减 1 并且当前元素和下一个元素相加等于 sum。在循环中,每次满足条件时,增加 cnt 的值,并将 i 向后移动 2 位。
最终返回符合条件的元素对数量 cnt。
这个算法的时间复杂度取决于数组的长度,为 O(n),其中 n 是数组 nums 的长度。空间复杂度为 O(1),因为只使用了常量级别的额外空间。
AC代码
/** * @param {number[]} nums * @return {number} */ var maxOperations = function (nums) { if (nums.length < 2) return 0; const sum = nums[0] + nums[1]; let i = 0, cnt = 0; while (i < nums.length - 1 && nums[i] + nums[i + 1] === sum) { cnt++; i += 2; } return cnt; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。