lintcode:买卖股票的最佳时机 I
问题
买卖股票的最佳时机
假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。
如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。
样例
给出一个数组样例 [3,2,3,1,2], 返回 1
使用 动态规则 代码
算法描述:
- 使用
price_min
记录着最低的价格。使用gain_max
记录着最大利润。 - 遍历所有的价格。
2.1. 如果发现 现在的价格 比price_min
还要小。那么price_min
赋值为 现在的价格。
2.2. 如果发现 现在的利润 比gain_max
还要大。那么gain_max
赋值为 现在的利润。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int gain_max(int *prices, int len)
{
int price_min = prices[0];
int gain_max = 0;
int gain_new;
int i;
for (i = 0; i < len; ++i) {
gain_new = prices[i] - price_min;
if (gain_new < 0) {
/* record the lowest price */
price_min = prices[i];
}
else {
/* record the greatest gain */
if (gain_new > gain_max) {
gain_max = gain_new;
}
}
printf("[%d]=%d, gain_max=%d, buy=%d\n", i, prices[i], gain_max, price_min);
}
return gain_max;
}
int main(int argc, char **argv) {
int len = argc -1;
char **arr_string = argv + 1;
if (len <= 0) {
printf("input failed!\n");
goto fail_input;
}
/* array to keep prices */
int *arr = (int *)malloc(len * sizeof(int));
if (NULL == arr) {
printf("memory alloc failed!\n");
goto fail_alloc;
}
/* parse command line */
int i;
for (i = 0; i < len; ++i) {
arr[i] = atoi(arr_string[i]);
}
/* print prices */
for (i = 0; i < len; ++i) {
printf("%d, ", arr[i]);
}
printf("\n");
/* print max gain */
printf("gain_max: %d\n", gain_max(arr, len));
/* free data */
free(arr);
return 0;
fail_alloc:
fail_input:
return -1;
}