面试经典150题 day7
- 题目来源
- 我的题解
- 方法一 暴力 (超时)
- 方法二 动态规划
- 方法三 动态规划 空间优化
- 方法四 一次遍历
题目来源
力扣每日一题;题序:121
我的题解
方法一 暴力 (超时)
求每一对(prices[i],prices[j])的差值,最后得到最大差值。
时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)
public class Solution {public int maxProfit(int[] prices) {int maxprofit = 0;for (int i = 0; i < prices.length - 1; i++) {for (int j = i + 1; j < prices.length; j++) {int profit = prices[j] - prices[i];if (profit > maxprofit) {maxprofit = profit;}}}return maxprofit;}
}
方法二 动态规划
使用一个n×2的dp表示某一天买与卖的最大利润。dp[i][0]表示第i天买入或不买的最大利润,dp[i][1]表示第i天卖或不卖的最大利润。
时间复杂度:O(n)
空间复杂度:O(n)
public int maxProfit(int[] prices) {int n=prices.length;int[][] dp=new int[n][2];//0表示买,1表示卖for(int i=0;i<n;i++){if(i==0){dp[i][0]=-prices[0];dp[i][1]=0;continue;}//当前买的最大利润 本次不买或者本次买的最大值dp[i][0]=Math.max(dp[i-1][0],-prices[i]);//当前卖的最大利润 本次卖或者本次不卖的最大值dp[i][1]=Math.max(dp[i-1][0]+prices[i],dp[i-1][1]);}return dp[n-1][1];
}
方法三 动态规划 空间优化
实际只和上一天的情况有关,因此将dp表优化为常量
时间复杂度:O(n)
空间复杂度:O(1)
public int maxProfit(int[] prices) {int n=prices.length;int dp_0=-prices[0];//买int dp_1=0;//卖for(int i=1;i<n;i++){int t=dp_0;//当前买的最大利润 本次不买或者本次买的最大值dp_0=Math.max(dp_0,-prices[i]);//当前卖的最大利润 本次卖或者本次不卖的最大值dp_1=Math.max(t+prices[i],dp_1);}return dp_1;
}
方法四 一次遍历
在历史最低点买的股票就好了!太好了,在题目中,只要用一个变量记录一个历史最低价格 minprice,就可以假设自己的股票是在那天买的。那么在第 i 天卖出股票能得到的利润就是 prices[i] - minprice。
时间复杂度:O(n)
空间复杂度:O(1)
public int maxProfit(int prices[]) {int minprice = Integer.MAX_VALUE;int maxprofit = 0;for (int i = 0; i < prices.length; i++) {if (prices[i] < minprice) {minprice = prices[i];} else if (prices[i] - minprice > maxprofit) {maxprofit = prices[i] - minprice;}}return maxprofit;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~