力扣爆刷第165天之TOP100五连刷91-95(岛屿DFS、打家劫舍、堆排)

力扣爆刷第165天之TOP100五连刷91-95(岛屿DFS、打家劫舍、堆排)

一、226. 翻转二叉树

题目链接:https://leetcode.cn/problems/invert-binary-tree/description/
思路:翻转二叉树,只需要前序遍历交换左右子树,然后递归遍历左右子树即可。

class Solution {
    public TreeNode invertTree(TreeNode root) {
        traverse(root);
        return root;
    }
    void traverse(TreeNode root) {
        if(root == null) return;
        TreeNode t = root.left;
        root.left = root.right;
        root.right = t;
        traverse(root.left);
        traverse(root.right);
    }
}

二、695. 岛屿的最大面积

题目链接:https://leetcode.cn/problems/max-area-of-island/description/
思路:求最大的岛屿面积,典型的深度优先解题,通过DFS遍历岛屿每次开始遍历一个岛屿时 ,记录岛屿中陆地的数量,遍历完成后进行最大值的记录。

class Solution {
    int max = 0, sum = 0;
    public int maxAreaOfIsland(int[][] grid) {
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[0].length; j++) {
                if(grid[i][j] == 1) {
                    dfs(grid, i, j);
                    max = Math.max(max, sum);
                    sum = 0;
                }
            }
        }
        return max;
    }

    void dfs(int[][] grid, int x, int y) {
        if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == 0) return;
        sum++;
        grid[x][y] = 0;
        dfs(grid, x-1, y);
        dfs(grid, x, y-1);
        dfs(grid, x+1, y);
        dfs(grid, x, y+1);
    }
}

三、152. 乘积最大子数组

题目链接:https://leetcode.cn/problems/maximum-product-subarray/description/
思路:本题让求最大子数组的乘积,但是数组元素有正有负,这样就有可能出现正数乘着乘着变成负数,负数乘着乘着变成正数的问题,所以为了防止这样的两极问题的出现,可以专门 维护两个数组,一个是最大数值的数组,一个是最小数组的数组,这样对于每一个位置来说既可以只使用当前元素,也可以与前一个位置的最大乘积或者最小乘积相乘,以此进行比较。

class Solution {
    public int maxProduct(int[] nums) {
        double[] dpMax = new double[nums.length];
        double[] dpMin = new double[nums.length];
        dpMax[0] = nums[0];
        dpMin[0] = nums[0];
        double max = nums[0];
        for(int i = 1; i < nums.length; i++) {
            dpMax[i] = Math.max(nums[i], Math.max(nums[i] * dpMax[i-1], nums[i] * dpMin[i-1]));
            dpMin[i] = Math.min(nums[i], Math.min(nums[i] * dpMax[i-1], nums[i] * dpMin[i-1]));
        }
        for(double i : dpMax) {
            max = Math.max(max, i);
        }
        return (int)max;
    }
}

四、198. 打家劫舍

题目链接:https://leetcode.cn/problems/house-robber/description/
思路:打家劫舍是经典的动态规划问题,本题要求不能连续的打劫两家,否则就会被报警,所以,对于每一家来说,他偷不偷当前这家取决于前两家的状态,如果偷当前这家,前一家就不能偷,如果不偷当前这家,那么前前加就可以偷。

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 1) return nums[0];
        int a = nums[0], b = Math.max(nums[0], nums[1]), c = 0;
        for(int i = 2; i < nums.length; i++) {
            c = Math.max(nums[i]+a, b);
            a = b;
            b = c;
        }
        return b;
    }
}

五、912. 排序数组

题目链接:https://leetcode.cn/problems/sort-an-array/
思路:排列算法有很多,一般掌握快排,堆排,归并。堆排的话,只需要先从最后一个非叶子节点开始建立一个大根堆,然后不断的把数组头元素与数组尾元素交换即可。

class Solution {
    
    public int[] sortArray(int[] nums) {
        heapSort(nums);
        return nums;
    }

    void heapSort(int[] nums) {
        int len = nums.length;
        for(int i = len / 2 -1; i >= 0; i--) bulidMaxHeap(nums, i, len);
        for(int i = len-1; i > 0; i--) {
            int t = nums[0];
            nums[0] = nums[i];
            nums[i] = t;
            bulidMaxHeap(nums, 0, i);
        }
    }
    
    void bulidMaxHeap(int[] nums, int start, int end) {
        int k = start, t = nums[start];
        for(int i = start*2+1; i < end; i = i*2+1) {
            if(i+1 < end && nums[i] < nums[i+1]) i = i+1;
            if(t < nums[i]) {
                nums[k] = nums[i];
                k = i;
            }else break;
        }
        nums[k] = t;
    }
}

相关推荐

  1. 91hot10041-45

    2024-07-17 23:24:04       41 阅读
  2. 95hot10061-65

    2024-07-17 23:24:04       34 阅读
  3. 100hot10086-90

    2024-07-17 23:24:04       36 阅读
  4. 90hot10036-40

    2024-07-17 23:24:04       42 阅读
  5. 92hot10046-50

    2024-07-17 23:24:04       39 阅读
  6. 94hot10056-60

    2024-07-17 23:24:04       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 23:24:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 23:24:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 23:24:04       58 阅读
  4. Python语言-面向对象

    2024-07-17 23:24:04       69 阅读

热门阅读

  1. 【Go系列】Go的内存分配

    2024-07-17 23:24:04       23 阅读
  2. QTablewidget开发详解

    2024-07-17 23:24:04       23 阅读
  3. springboot防止重复提交的方案有哪些

    2024-07-17 23:24:04       19 阅读
  4. Bigdata-Docker构建大数据学习开发环境

    2024-07-17 23:24:04       18 阅读
  5. Flutter实战小案例

    2024-07-17 23:24:04       21 阅读
  6. 【读书笔记】训练自己的数据集yolov8

    2024-07-17 23:24:04       22 阅读
  7. C#自定义异常(Exception)的实现

    2024-07-17 23:24:04       24 阅读
  8. JDK 方法中的小坑

    2024-07-17 23:24:04       19 阅读
  9. LVS集群简介

    2024-07-17 23:24:04       21 阅读
  10. 类和对象-多态-纯虚函数和抽象类

    2024-07-17 23:24:04       19 阅读
  11. 建筑产业网元宇宙的探索与实践

    2024-07-17 23:24:04       21 阅读