算法练习
算法练习(更新中...)
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]); } }

浙公网安备 33010602011771号