2021-05-28LC “阿里题库” 64.最小路径和 215数组中的第K个最大元素

这篇博客探讨了动态规划在解决最短路径问题中的应用,通过优化空间复杂度实现了一种简洁的解决方案。同时,文章还介绍了两种不同的排序算法,用于找到数组中的第k大元素,分别是从小到大和从大到小排序的方法。这些算法的时间复杂度均为O(n^2)。
摘要由CSDN通过智能技术生成

在这里插入图片描述


/*动态规划: 
注意:m,n已经给了范围,所以不需要写grid.length==0.grid==null的情况
因为用动态规划所以我们要考虑边界和转移方程,转移方程可以直接用grid[]代替,
因为每次都是向下或者向右走所以只考虑上边界和左边界 dp[0][0] = grid[0][0],dp[0][j] = dp[0][j-1] + grid[0][j]
左边界:dp[i][0]=dp[i-1][0] + grid[i][0]
转移方程 dp[i][j] = Math.min(dp[i-1][j] , dp[i][j-1]) + grid[i][j]
返回值dp[m-1][n-1]
时间复杂度O(mn) 空间复杂度O(mn)
*/
class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length , n = grid[0].length;
        int[][] dp = new int[m][n];
        dp[0][0] = grid[0][0];
        for(int i=1 ; i < m ; i++){
            dp[i][0] = dp[i-1][0] + grid[i][0];
        }
        for(int j=1 ; j<n ; j++){
            dp[0][j] = dp[0][j-1] + grid[0][j];
        }
        for(int i=1 ; i<m ; i++){
            for(int j=1 ; j<n ; j++){
                dp[i][j] = Math.min(dp[i-1][j] , dp[i][j-1]) + grid[i][j];
            }
        }
        return dp[m-1][n-1];
    }
}

//进一步简化,没有必要进行创建新的dp[][],直接用给的二维数组grid[][]即可
//时间复杂度O(mn)空间复杂度O(1)
class Solution {
    public int minPathSum(int[][] grid) {
        for(int i=0 ; i<grid.length ; i++){
            for(int j=0 ; j<grid[0].length ; j++){
                if(i==0 && j==0) continue;  //不用改变grid的值
                else if(i == 0) grid[0][j] = grid[0][j-1] + grid[i][j];
                else if(j == 0) grid[i][0] = grid[i-1][0] + grid[i][j];
                else grid[i][j] = Math.min(grid[i-1][j] , grid[i][j-1]) + grid[i][j];
            }
        }
        return grid[grid.length-1][grid[0].length-1];
    }
}

在这里插入图片描述

//注意 1<=k<=数组的长度  所以不用额外判断k是否有效,因为它总有效
//这道题考察的是排序
//时间复杂度O(n*n) 空间复杂度O(1)
class Solution {
    public int findKthLargest(int[] nums, int k) {
        int len = nums.length;
        int temp;  //中间变量
        for(int i=0 ; i<len-1 ; i++){
            for(int j=i+1 ; j<len ; j++){
                if(nums[i]>nums[j]){
                    temp = nums[j];
                    nums[j] = nums[i];
                    nums[i] = temp;
                }
            }
        }
        return nums[len-k];
    }
}
//也可以从大到小排序
class Solution {
    public int findKthLargest(int[] nums, int k) {
        int len = nums.length;
        int temp;  //中间变量
        for(int i=0 ; i<len-1 ; i++){
            for(int j=i+1 ; j<len ; j++){
                if(nums[i]<nums[j]){
                    temp = nums[j];
                    nums[j] = nums[i];
                    nums[i] = temp;
                }
            }
        }
        return nums[k-1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值