Loading

2021-08-26 力扣刷题笔记

TOC

每日一题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:

1626667201-NCWmuP-image.png (253×253) (leetcode-cn.com)

输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

示例 2:

1626667205-xFxIeK-image.png (253×253) (leetcode-cn.com)

输入: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:

oranges.png (1306×275) (leetcode-cn.com)

输入:[[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;
        }
    }
} 

 



posted @ 2021-08-27 00:10  littleziao  阅读(59)  评论(0)    收藏  举报