55. 跳跃游戏
思路
(贪心)
从前往后遍历 nums 数组,记录我们能跳到的最远位置 j ,如果存在我们不能跳到的下标 i ,返回
false 即可,否则返回 true 。
具体过程如下:
1、定义一个 j 变量用来记录我们可以跳到的最远位置,初始化 j = 0 。
2、遍历整个 nums[] 数组, i 表示当前需要跳到的下标位置。
若 j < i ,说明下标 i 不可达,则返回 false ;
否则,说明 i 可达,则我们以 i 为起点更新可以跳到的最远位置 j ,即 j = max(j, i +
nums[i]) ;
3、如果可以遍历完整个数组,说明可以到达最后一个下标 i ,我们返回 true 。
时间复杂度分析: 只遍历一次数组,因此时间复杂度为 。
c++代码
vector<vector<bool>> st(n + 1, vector<bool>(m + 1));
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int x = 0, y = 0, d = 1;
for(int i = 1; i <= n * m; i++){
res.push_back(matrix[x][y]);
st[x][y] = true;
int a = x + dx[d], b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]){
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool canJump(vector<int>& nums) {
for(int i = 0, j = 0; i < nums.size(); i++){
if(j < i) return false;
else j = max(j, i + nums[i]);
}
return true;
}
};
1
2
3
4
5
6
7
8
9
10