Fork me on github

算法练习

算法练习(更新中...)

1 动态规划算法

算法简介

动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。
动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

算法举例

力扣爬楼梯问题

class Solution {
    public int climbStairs(int n) {
        //else return climbStairs(n-1)+climbStairs(n-2);超时了
        //动态规划
        int p = 0, q = 0, r = 1;
        for (int i = 1; i <= n; ++i) {
            p = q; 
            q = r; 
            r = p + q;
        }
        return r;
    }
    }

开始使用递归发现超时,递推公式为climbStairs(n-1)+climbStairs(n-2),后面优化之后只需要存储前2个数值大小即可。

卖股票的最佳时机

class Solution {
    public int maxProfit(int[] prices) {
        int []dp=new int[2];
        dp[0]=0;
        dp[1]=-prices[0];
        for(int i=0;i<prices.length;i++){
            dp[0]=Math.max(dp[0],dp[1]+prices[i]);
            dp[1]=Math.max(dp[1],-prices[i]);
        }
        return dp[0];

    }
}

解题思路:最终的结果与2个元素相关,所以只需要找到最小的数值,以及在后面最大的数值,构建递推方程即可解决相关问题。

 2 常用API及其应用

最小时间差

class Solution {
    public int findMinDifference(List<String> timePoints) {
        int[] arr = new int[timePoints.size()];
        for (int i = 0; i < arr.length; i++) {
       //这里面是时间转换的API arr[i]
= Integer.parseInt(timePoints.get(i).substring(0, 2)) * 60 + Integer.parseInt(timePoints.get(i).substring(3)); } Arrays.sort(arr); int min = Integer.MAX_VALUE; for (int i = 1; i < arr.length; i++) { min = Math.min(min, arr[i] - arr[i - 1]); }
//这里面加上1440的用处就是例如00:00 与23:59的相关转换的精度问题
return Math.min(min, arr[0] + 1440 - arr[arr.length - 1]); } }

 

posted @ 2021-07-25 11:26  了不起的盖茨比  阅读(70)  评论(0)    收藏  举报
Copyright © 2021 LinCangHai
Powered by .NET 5.0 on Kubernetes