做了两个关于股票买卖的算法题,题目如下
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
个人分析:只能买卖一下,这个时候,从数学的角度来讲,当天价格减去昨天价格,若为正数,就是赚,若为负数,就是亏,将这些数当成另外一个序列,取这些数的最大正子数组。即为最大利润。
class Solution {
public int maxProfit(int[] prices) {
//声明利润为0
int profit=0;
//存储临时利润变化情况
int temp=0;
//记录利润最大值
int max=0;
//创建集合存储利润变化序列
List<Integer> li = new ArrayList<Integer>();
for(int i=0;i<prices.length-1;i++){
profit=prices[i+1]-prices[i];
li.add(profit);
}
//判断前N个数的正负,为正,接着遍历,为负,重置临时利润为零往后面取,每次当利润为正时,判断利润最大值
for(int i : li){
if(temp+i>0){
temp+=i;
if(max<temp)max=temp;
}
else{
temp=0;
}
}
return max;
}
}
用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。
交易次数不限,但一次只能交易一支股票,也就是说手上最多只能持有一支股票,求最大收益。
你可以完成尽可能多的交易(多次买卖股票)。
然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。
分析:买卖次数不限制,即可视为若第二天比第一天大,就卖,小就不卖,转化成程序就是遍历整个数组,比较前一个数和后一个数。
public static int maxProfit(int[] prices){
//声明利润为0
int profit=0;
for(int i=0;i<prices.length-1;i++){
if(prices[i]<prices[i+1]){
profit+=prices[i+1]-prices[i];
}
}
return profit;
}