2021-08-26 力扣刷题笔记
每日一题881. 救生艇
题目描述
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
示例 2:
输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
示例 3:
输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)
解题思路
使用左右指针,当左指针 + 右指针 <= limit时,ans + 1,左右指针向中间移动。否则右指针向中间移动,ans + 1.
代码实现
class Solution {
public int numRescueBoats(int[] people, int limit) {
int ans = 0;
int left = 0;
int right = people.length - 1;
while(left <= right){
if(people[left] + people[right] <= limit){
ans++;
left++;
rigth--;
}else{
ans++;
rigth--;
}
}
return ans;
}
}
一、542. 01 矩阵
题目描述
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:

输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]
示例 2:

输入:mat = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0,0],[0,1,0],[1,2,1]]
解题思路
广度优先搜索,找到每个1最近的0。首先将数组和队列初始化,将所有为0的位置加入队列,所有为1的位置置为-1来做标记。然后从各个0开始向1扩散,如果这个源点的上下左右点有-1,那么将这个点置为源点数 + 1,再将这个点加入队列中作为源点,直到图中没有为 -1 的点。
代码实现
class Solution {
public int[][] updateMatrix(int[][] mat) {
Queue<int[]> queue = new LinkedList<>();
// 初始化
for(int i = 0; i < mat.length; i++){
for(int j = 0; j < mat[0].length; j++){
if(mat[i][j] == 0){
queue.offer(new int[] {i, j});
}else{
mat[i][j] == -1;
}
}
}
int[] dx = new int[] {-1, 1, 0, 0};
int[] dy = new int[] {0, 0, -1, 1};
while(!queue.isEmpty()){
int[] cur = queue.poll();
int x = cur[0];
int y = cur[1];
for(int i = 0; i < 4; i++){
int newX = x + dx[i];
int newY = y + dy[i];
if(newX >= 0 && newX < mat.length && newY >= 0 && newY < mat[0].length &&
mat[newX][newY] == -1 ){
mat[newX][newY] = mat[x][y] + 1;
queue.offer(mat[newX][newY]);
}
}
}
return mat;
}
}
二、994. 腐烂的橘子
题目描述
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
示例 1:

输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
解题思路
与上一个题类似,在上一题的基础上加上一层循环用来控制一层遍历,即每次都将当前轮次的源点遍历完之后在遍历下一轮的源点,同时每一轮都将sum++;
代码实现
class Solution {
public int orangesRotting(int[][] grid) {
Queue<int[]> queue = new LinkedList<>();
int sum = 0;
int count = 0;
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(grid[i][j] == 2){
queue.offer(new int[]{i, j});
}else{
count++;
}
}
}
int[] dx = new int[] {-1, 1, 0, 0};
int[] dy = new int[] {0, 0, -1, 1};
while(!queue.isEmpty()){
int[] cur = queue.poll();
int x = cur[0];
int y = cur[1];
int n = queue.size();
for(int i = 0; i < n; i++){
sum++;
for(int j = 0; j < 4; j++){
int newX = x + dx[i];
int newY = y + dy[i];
if(newX >= 0 && newX < grid.length && newY >= 0 && newY < grid[0].length &&
grid[newX][newY] == 1){
grid[newX][newY] == 2;
queue.offer(grid[newX][newY]);
conun--;
}
}
}
}
if(count > 0){
return -1;
}else{
return sum;
}
}
}

浙公网安备 33010602011771号