面试经典150题 day7
题目来源
我的题解
方法一 暴力 (超时)
求每一对(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;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~