题目
算法思路
该问题也就是要找出给定数组中两个数字之间的最大差值,且第二个数字必须大于第一个数字。
如果用暴力法求解,时间复杂度为
O
(
n
2
)
O(n^2)
O(n2),会超时。
利用 动态规划 思想通过一次遍历就可以解决该问题。
设
d
p
[
i
]
dp[i]
dp[i] 代表以
p
r
i
c
e
s
[
i
]
prices[i]
prices[i] 为结尾的子数组的最大利润,用一个变量
m
i
n
P
r
i
c
e
minPrice
minPrice 记录目前为止最低价格,则
d
p
[
i
]
=
m
a
x
(
d
p
[
i
−
1
]
,
p
r
i
c
e
s
[
i
]
−
m
i
n
P
r
i
c
e
)
dp[i]=max(dp[i-1],\ prices[i] - minPrice)
dp[i]=max(dp[i−1], prices[i]−minPrice)。
具体代码
class Solution {
public int maxProfit(int[] prices) {
int minPrice = Integer.MAX_VALUE;//最低价格初始化
int maxProfit = 0;//最大利润初始化
for(int price : prices){
maxProfit = Math.max(maxProfit, price - minPrice);
minPrice = Math.min(minPrice, price);
}
return maxProfit;
}
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)