498. 对角线遍历
设置一个标志,控制右上还是左下;
首先正常的移动你的坐标;
然后判断有没有你变换后的坐标,有没有越界;
如果越界了,就变换一下;
这里变换右上有两种;
左下有两种;
while(index < cnt) {
ans[index++] = mat[x][y];//在这加,因为下面已经在判断下一个位置了
int nx, ny;
if(dir == 1) {先加上
nx = x - 1;
ny = y + 1;
}else {
nx = x + 1;
ny = y - 1;
}
if(index < cnt && (nx < 0 || ny < 0 || nx >= r || ny >= c)) {先加上,再判断
if(dir == 1) {
nx = y + 1 < c ? x : x + 1;
ny = y + 1 < c ? y + 1 : y;
}else {
nx = x + 1 < r ? x + 1 : x;
ny = x + 1 < r ? y : y + 1;
}
dir = dir * -1;越界了,开启新方向
}
x = nx;
y = ny;
}
1668. 最大重复子字符串
String temp = word;
int ans = 0;
while(sequence.contains(word)) {已经包含了一次
word += temp;
ans++;
}
return ans;
485. 最大连续 1 的个数
int ans = 0, cur = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 0) {
cur = 0;
}else {
cur++;
ans = Math.max(ans, cur);//对哦,是更新cur的时候同时更新ans,而不是检测到零时更新ans
}
}
463. 岛屿的周长
遍历全部;
当遇到岛屿时;
查看其四边,是否出界或者是否有水;
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
if(grid[i][j] == 1) {
int cur = 0;
for(int[] dir : dirs) {四边
int nx = i + dir[0];
int ny = j + dir[1];
if(nx < 0 || nx >= r || ny < 0 || ny >= c || grid[nx][ny] == 0) {是否出界或者是否有水
cur++;
}
}
ans += cur;
}
}
}