LeetCode149--最小路径和(L64)、颜色分类(L75)

1、最小路径和

//给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 
//
// 说明:每次只能向下或者向右移动一步。 
//
// 
//
// 示例 1: 
//
// 
//输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
//输出:7
//解释:因为路径 1→3→1→1→1 的总和最小。
// 
//
// 示例 2: 
//
// 
//输入:grid = [[1,2,3],[4,5,6]]
//输出:12
// 
//
// 
//
// 提示: 
//
// 
// m == grid.length 
// n == grid[i].length 
// 1 <= m, n <= 200 
// 0 <= grid[i][j] <= 100 
// 
// Related Topics 数组 动态规划

 这个题我们需要一个个计算到达矩阵中每个点的最短路径,这样一来到最后那个点自然是最小的,所以我们新建一个数组dp[][]来计算到每个点的最短路径之和,这样我们再管每一个点,在边缘的点,因为只能向右和向下走,所以dp[0][j]=dp[0][j-1]+matrix[0][j],dp[i][0]=dp[i-1][0]+matrix[i][0],而在中间的点我们需要考虑是从上还是从左来的路径短,所以我们取最小值,dp[i][j]=Math.min(dp[i][j-1],dp[i-1][j])+matrix[i][j]这样来确定它的最短路径。

public int minPathSum(int[][] grid) {
        //dp[i][0] = dp[i-1][0]+grid[i][0]
        //dp[0][j] = dp[0][j-1]+grid[0][j]
        //dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])+grid[i][j]
        if(grid == null || grid.length == 0 || grid[0].length == 0){
            return 0;
        }
        int rows = grid.length;
        int cols = grid[0].length;
        int[][] dp = new int[rows][cols];
        dp[0][0] = grid[0][0];
        for (int i = 1; i < rows; i++) {
            dp[i][0] = dp[i-1][0]+grid[i][0];
        }
        for (int j = 1; j < cols; j++) {
            dp[0][j] = dp[0][j-1]+grid[0][j];
        }
        for (int i = 1; i < rows; i++) {
            for (int j = 1; j < cols; j++) {
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
            }
        }
        return dp[rows-1][cols-1];
    }

2、颜色分类(L75)

//给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 
//
// 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 
//
// 
// 
//
// 
//
// 示例 1: 
//
// 
//输入:nums = [2,0,2,1,1,0]
//输出:[0,0,1,1,2,2]
// 
//
// 示例 2: 
//
// 
//输入:nums = [2,0,1]
//输出:[0,1,2]
// 
//
// 示例 3: 
//
// 
//输入:nums = [0]
//输出:[0]
// 
//
// 示例 4: 
//
// 
//输入:nums = [1]
//输出:[1]
// 
//
// 
//
// 提示: 
//
// 
// n == nums.length 
// 1 <= n <= 300 
// nums[i] 为 0、1 或 2 
// 
//
// 
//
// 进阶: 
//
// 
// 你可以不使用代码库中的排序函数来解决这道题吗? 
// 你能想出一个仅使用常数空间的一趟扫描算法吗? 
// 
// Related Topics 排序 数组 双指针

这道题我懒的想了,直接用选择排序:

public void sortColors(int[] nums) {
        //普通选择排序
        for (int i = 0; i < nums.length - 1; i++) {
            int min = nums[i];
            for (int j = i; j<nums.length; j++) {
                if(nums[j] < min){
                    min = nums[j];
                    int temp = nums[j];
                    nums[j] = nums[i];
                    nums[i] = temp;
                }
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值