Easy
题目描述
一只蚂蚁在边界上。它有时向左走,有时向右走。
给你一个非零整数数组 nums。蚂蚁从数组的第一个元素开始读取,直到结束。在每一步中,它根据当前元素的值移动:
- 如果 nums[i] < 0,它向左移动 -nums[i] 个单位。
- 如果 nums[i] > 0,它向右移动 nums[i] 个单位。
返回蚂蚁返回边界的次数。
注意:
- 边界两侧都有无限的空间。
- 我们只在蚂蚁移动了 |nums[i]| 个单位后检查它是否在边界上。换句话说,如果蚂蚁在移动过程中穿过了边界,这不会被计算在内。
示例 1:
输入:nums = [2,3,-5]
输出:1
解释:第一步后,蚂蚁在边界右侧 2 步。
第二步后,蚂蚁在边界右侧 5 步。
第三步后,蚂蚁在边界上。
所以答案是 1。
示例 2:
输入:nums = [3,2,-3,-4]
输出:0
解释:第一步后,蚂蚁在边界右侧 3 步。
第二步后,蚂蚁在边界右侧 5 步。
第三步后,蚂蚁在边界右侧 2 步。
第四步后,蚂蚁在边界左侧 2 步。
蚂蚁从未返回边界,所以答案是 0。
约束:
- 1 <= nums.length <= 100
- -10 <= nums[i] <= 10
- nums[i] != 0
解题思路
这道题是一个简单的模拟问题,我们需要跟踪蚂蚁的位置并计算它返回边界(位置为0)的次数。
解题思路:
- 蚂蚁从边界(位置0)开始
- 维护一个位置变量,记录蚂蚁当前的位置
- 对数组中的每个元素,将其值加到位置变量上
- 每次移动后检查位置是否为0,如果是则计数器加1
- 返回总的计数次数
具体步骤:
- 初始化位置position = 0和计数器count = 0
- 遍历数组中的每个数字
- 将数字加到position上(正数向右移动,负数向左移动)
- 如果移动后position等于0,说明回到边界,count加1
- 最后返回count
这个解法的时间复杂度是O(n),空间复杂度是O(1),其中n是数组的长度。算法非常直接,就是按题目要求模拟蚂蚁的移动过程。
代码实现
class Solution {
public:
int returnToBoundaryCount(vector<int>& nums) {
int position = 0;
int count = 0;
for (int num : nums) {
position += num;
if (position == 0) {
count++;
}
}
return count;
}
};
class Solution:
def returnToBoundaryCount(self, nums: List[int]) -> int:
position = 0
count = 0
for num in nums:
position += num
if position == 0:
count += 1
return count
public class Solution {
public int ReturnToBoundaryCount(int[] nums) {
int position = 0;
int count = 0;
foreach (int num in nums) {
position += num;
if (position == 0) {
count++;
}
}
return count;
}
}
/**
* @param {number[]} nums
* @return {number}
*/
var returnToBoundaryCount = function(nums) {
let position = 0;
let count = 0;
for (let i = 0; i < nums.length; i++) {
position += nums[i];
if (position === 0) {
count++;
}
}
return count;
};
复杂度分析
| 指标 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
其中 n 是数组 nums 的长度。我们只需要遍历数组一次,每次操作都是常数时间,因此时间复杂度为 O(n)。只使用了常数个变量来存储位置和计数,所以空间复杂度为 O(1)。