数学 动规 滑动窗口 HashMap里放数组 dfs 暴力

  1. 1 比特与 2 比特字符
    int n = bits.length;
    int i = 0; 因为,如果最后一个字符必须是一个一比特字符,那么,一定可以跳到最会一个位置。也就是n-1这个位置。所以不能遍历到这个位置
    while(i < n - 1) {如果最后一个位置,不是单独的一位,那么一定是会跳到n这个位置的
    i += bits[i] + 1;不管是11还是10都是以1为开头的两位,跳两步与跳一步的情况
    }

714. 买卖股票的最佳时机含手续费

b[0] = -prices[0];
for(int i = 1; i < n; i++) {
b[i] = Math.max(b[i - 1], s[i - 1] - prices[i]);持有
s[i] = Math.max(s[i - 1], b[i - 1] + prices[i] - fee);未持有
}


713. 乘积小于 K 的子数组

while(r < nums.length) {
sum = nums[r];
while(sum >= k) {**//attention因为可能
了一个不得了的数字**
sum /= nums[l];
l++;
}
ans += r - l + 1;
r++;
}


697. 数组的度

Map<Integer, int[]> map = new HashMap<>();
map.put(nums[i], new int[]{次数, 起始位置, 终止位置});
if(numMax < cur[0]) {找到出现次数最多的元素
numMax = cur[0];
lenMin = cur[2] - cur[1] + 1;
}else if(numMax == cur[0])可以等于,但不能小于
{
if(lenMin > (cur[2] - cur[1] + 1)) {更新最小值,因为起始值舍了0所以判断一下
lenMin = cur[2] - cur[1] + 1;
}

        }

695. 岛屿的最大面积

public int dfs(int[][] grid, int i, int j) {
if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) {越界了或者遇到水,直接返回0
return 0;
}
grid[i][j] = 0;//防止反复横跳;也不需要恢复,因为一块遍历过,就不需要再遍历了。都说了是一块;
int count = 1;
count += dfs(grid, i - 1, j);
count += dfs(grid, i + 1, j);
count += dfs(grid, i, j - 1);
count += dfs(grid, i, j + 1);
//grid[i][j] = 1;attention错误
return count;
}


661. 图片平滑器

for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
int num = 0, sum = 0;开始求这个位置
for(int x = i - 1; x <= i + 1; x++) {(i - 1, j - 1)-(i + 1, j + 1)
for(int y = j - 1; y <= j + 1; y++) {
if( x >= 0 && y >= 0 && x < r && y < c) {
num++;
sum += img[x][y];
}
}
}
ans[i][j] = sum / num;
}
}

posted on 2022-11-05 17:37  xtdnn  阅读(29)  评论(0)    收藏  举报

导航