买卖股票的最佳时机
FJHHH Lv3

前言

中午在LintCode上看到一系列题目,看起来还蛮有意思的,于是先做了第一道。

题目

假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。

您在真实的面试中是否遇到过这个题? Yes

样例

给出一个数组样例 [3,2,3,1,2], 返回 1

思路

暴力

很容易想到一个O(n2)的方法,求出数组中最大的prices[j] - prices[i](j > i):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    // 3872 ms
public class Solution {
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
public int maxProfit(int[] prices) {
if (prices == null) {
return 0;
}
int l = prices.length;
if (l == 0) {
return 0;
}
int max = 0;

for (int i = 0; i < l; i++) {
for (int j = i + 1; j < l;j++) {
max = Math.max(max, prices[j] - prices[i]);
}
}
return max;
}
}
### 动态规划

显然上面的方法简单好理解但是不快。其实可以把价格数组中相邻两数之差作为一个新的数组sub,此时可以把问题转换为求最大的子数组和,复杂度就是O(n)了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//1364 ms
public class Solution {
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
public int maxProfit(int[] prices) {
if (prices == null) {
return 0;
}
int l = prices.length;
if (l == 0) {
return 0;
}
int max = 0;
int temp = 0;
for (int i = 1; i < l; i++) {
int temps = prices[i] - prices[i - 1];
temp += temps;
max = Math.max(max, temp);
temp = temp<0?0:temp;
}
max = Math.max(max, temp);
return max;
}
}
 Comments