目录java
动态规划(Dynamic programming,简称DP),是一种把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划相较于递归,拥有更少的计算量。算法
给定一个整数数组 nums
,找到一个具备最大和的连续子数组(子数组最少包含一个元素),返回其最大和。数组
sum>0
,表示sum对结果有增益效果,则保留sum并加上当前遍历数字。sum<=0
,表示无增益,那么直接舍弃,让sum更新为当前遍历数字。public static int maxSubArray(int[] nums){ int sum = 0; int target = nums[0]; for(int num:nums){ //sum>0 增益效果,保留sum并加上当前遍历数字 if(sum>0){ sum+=num; //sum<=0 无增益效果,直接舍弃,并将sum更新为当前遍历数字 }else{ sum = num; } //比较sum和target的大小,将最大值设为target target = Math.max(target, sum); } return target; }
假设你正在爬楼梯。须要 n 阶你才能到达楼顶。优化
每次你能够爬 1 或 2 个台阶。你有多少种不一样的方法能够爬到楼顶呢?ui
注意:给定 n 是一个正整数。设计
public static int climbStairs(int n) { if (n == 1) return 1; int[] dp = new int[n + 1]; dp[1] = 1; dp[2] = 2; for (int i = 3; i < n + 1; i++) { // dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; }
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。code
若是你最多只容许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。递归
注意你不能在买入股票前卖出股票。索引
假设当前在第i天,令minPrice存储前i-1天的最低价格,令maxProfit存储前i-1天的最大收益,那么在第i天的状况:leetcode
prices[i]-minPrice
。public static int maxProfit(int[] prices){ int minPrice = Integer.MAX_VALUE; int maxProfit = 0; for(int i = 0;i<prices.length;i++){ minPrice = Math.min(minPrice,prices[i]); maxProfit = Math.max(prices[i]-minPrice,maxProfit); } return maxProfit; }
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
说明:
public class NumArray { private int[] sums; public NumArray(int[] nums){ sums = new int[nums.length+1]; for(int i = 0;i<nums.length;i++){ //建立从索引为1开始的数组,数组中存储的是原数组第一位到索引前一位的总和 sums[i+1] = sums[i]+nums[i]; } } public int sumRange(int i,int j){ return sums[j+1]-sums[i]; } /** * Your NumArray object will be instantiated and called as such: * NumArray obj = new NumArray(nums); * int param_1 = obj.sumRange(i,j); */ }
时间复杂度:预计算时间为O(n),可是实际查询只要O(1)。
空间复杂度:建立了新数组的空间,O(n)。
参考连接: