1. 程式人生 > >leetCode:121\122\309 股票買入和賣出獲取最大收益問題

leetCode:121\122\309 股票買入和賣出獲取最大收益問題

/**leetCode 121 :動態規劃求 最佳買入和賣出股票
    給出一組int陣列,每個值代表當天股票的價格,你只能買1次並且賣1次,求最大收益
    動態規劃求解:
*/
int maxProfit(vector<int>& prices) {
    if(prices.size()==0)
        return 0;
    int buy = INT_MAX;
    int profit = 0;
    for(int i=0;i<prices.size();i++){
        buy = min(buy,prices[i]);
        profit = max(profit,prices[i]-buy);
    }
    return profit;
}
/**leetCode 122 :動態規劃求 最佳買入和賣出股票
    給出一組int陣列,每個值代表當天股票的價格,你可以買入多次並賣出多次,但是買入之前必須先賣出,求最大收益
    動態規劃求解:
*/
int maxProfit(vector<int>& prices) {
    if(prices.size()==0)
        return 0;
    int buy = INT_MAX;
    int profit = 0;
    int sum = 0;
    for(int i=0;i<prices.size();i++){
        if(buy>=prices[i]){
            buy = prices[i];
            sum+=profit;
            profit=0;
        }
        if(profit<prices[i]-buy){
            profit = prices[i]-buy;
        }
        else{
            sum+=profit;
            profit=0;
            buy = prices[i];
        }
    }
    sum+=profit;
    return sum;
}
/**leetCode 309:與上面一樣,仍然計算股票的最大收益,可以完成多次交易,但是必須在買這個股票之前先賣掉它,
在你賣掉股票之後的一天是不能買股票的。
交易有三個狀態,buy,sell,rest;
定義buy[i]是前i天的任意序列以buy結尾的獲取的最大利潤
    sell[i]是前i天的任意序列以sell結尾的獲取的最大利潤
    rest[i]是前i天的任意序列以rest結尾的獲取的最大利潤
    則buy[i] = max(rest[i-1]-prices[i],buy[i-1]);
      sell[i] = max(buy[i-1]+prices[i],sell[i-1]);
      rest[i] = max(buy[i-1],sell[i-1],rest[i-1]);
    又因為 buy[i]<=rest[i],
           rest[i]<=sell[i];
    所以 rest[i] = sell[i-1];
    帶入最先定義的3個公式:
    buy[i] = max(sell[i-2]-prices[i],buy[i-1]);
    sell[i] =max(buy[i-1]+prices[i],sell[i-1]);
*/
int maxProfit2(vector<int>& prices) {
   int prebuy =0;
   int presell = 0;
   int buy =INT_MIN;
   int sell=0;
   for(int price:prices){
        prebuy = buy;
        buy = max(presell-price,prebuy);
        presell = sell;
        sell = max(prebuy+price,presell);
        cout<<prebuy<<" "<<sell<<endl;
   }
    return sell;
}



相關推薦

leetCode:121\122\309 股票買入獲取收益問題

/**leetCode 121 :動態規劃求 最佳買入和賣出股票 給出一組int陣列,每個值代表當天股票的價格,你只能買1次並且賣1次,求最大收益 動態規劃求解: */ int max

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你多只允許完成一筆交易(即買入一支股票),設計一個算法來計算你所能獲取利潤。

pan stat 給定 arr 註意 turn 大於 交易 nbsp 給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多只允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。 註意你不能在買入股票前賣出股票。 示例 1

leetcode 121 Best Time to Buy and Sell Stock(盈利)

題目要求(高頻題) 假設你有一個數組,其中第i個元素是第i天的股票價格。 如果您只被允許完成最多一筆交易(即買入並賣出一股股票),請設計演算法以找到最大利潤。 請注意,在購買之前不能出售股票。 解題思路 在陣列中尋找最大利潤,和leetcode 53 求最大子陣列是一種型別的題目

演算法:設計演算法以找到利潤。您可以根據需要完成儘可能多的交易(即,多次買入一股股票

假設您有一個數組,其中第i個元素是第i天給定股票的價格。 設計演算法以找到最大利潤。您可以根據需要完成儘可能多的交易(即,多次買入並賣出一股股票)。 注意:您不能同時進行多筆交易(即,您必須在再次購買之前賣出股票)。 例1: 輸入: [7,1,5,3,6,4] 輸出: 7 說明:在第2天

LeetCode:121. Best Time to Buy and Sell Stock (找股票收益)

      Say you have an array for which the ith element is the price of a given stock on day i.       If

前端演算法:設計演算法以找到利潤。您可以根據需要完成儘可能多的交易(即,多次買入一股股票

假設您有一個數組,其中第i個元素是第i天給定股票的價格。 設計演算法以找到最大利潤。您可以根據需要完成儘可能多的交易(即,多次買入並賣出一股股票)。 注意:您不能同時進行多筆交易(即,您必須在再次購買之前賣出股票)。 例1: 輸入: [7,1,5,3,6,4]

LeetCode:122. 買賣股票的最佳時機 II(C++)

題目: 給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個演算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。 注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。 示例 1: 輸入: [7,1

Leetcode 121:買賣股票的最佳時機

原題:給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個演算法來計算你所能獲取的最大利潤。注意你不能在買入股票前賣出股票。示例 1:輸入: [7,1,5,3,6,4] 輸出: 5 解釋: 在第 2 天

leetcode——Best Time to Buy and Sell Stock III 買賣股票收益(AC)

element cti () -- 最大 leetcode price imu cto Say you have an array for which the ith element is the price of a given stock on day i. D

LeetCode——動態規劃——股票收益

股票最大收益 一、問題描述 給出每天股票的價格,設計一個演算法計算出最大收益。可以最多買賣兩個回合。而且賣出之後才能再買。 二、樣例 // 1 Input : [3, 3, 5, 0, 0, 3, 1, 4] Output : 6 Explanation : 0-3, 1-4

Leetcode 123:買賣股票的最佳時機III(詳細的解法!!!)

給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。 設計一個演算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。 注意: 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。 示例 1: 輸入: [3,3,5,0,0,3,1

Leetcode 123 Best Time to Buy and Sell Stock III 至多兩次買賣股票收益

題目描述 Say you have an array for which the ith element is the price of a given stock on day i. 假設你有一個數組,裡面記錄的是每一天的股票的價格。 Desig

leetcode--一個for迴圈找陣列

//給定一個數組,找出陣列中最大值和次最大值。要求在一個for迴圈裡實現 #include "stdafx.h" #include<iostream> using namespace st

Leetcode 124 Binary Tree Maximum Path Sum 二叉樹路徑

原題連結 題目描述 Given a binary tree, find the maximum path sum. 給出一棵二叉樹,計算其最大路徑和。 The path may start and end at any node in the t

【BZOJ1280】Emmy豬pigs

mes 事先 == 經典 include sof 打開 鑰匙 zoj 【BZOJ1280】Emmy賣豬pigs Description Emmy在一個養豬場工作。這個養豬場有M個鎖著的豬圈,但Emmy並沒有鑰匙。顧客會到養豬場來買豬,一個接著一個。每一位顧客都會有一些豬

【bzoj1280】Emmy豬pigs

printf pig include clas using light 一行 front ans 題目描述 Emmy在一個養豬場工作。這個養豬場有M個鎖著的豬圈,但Emmy並沒有鑰匙。顧客會到養豬場來買豬,一個接著一個。每一位顧客都會有一些豬圈的鑰匙,他們會將這些豬圈打開

從輸入的值中獲取小值,輸入0後結束(利用do_while boolean isRight來標識用戶輸入)

bool out 用戶 system efault 最大 pub string void mport java.util.Scanner; public class DoWhile2 {public static void main(String[] args) { int

[LeetCode] Maximum Width of Binary Tree 二叉樹的寬度

example imu idt count ted pla con integer out Given a binary tree, write a function to get the maximum width of the given tree. The wi

作業題:輸入4個整數,找其中的數。用一個函數來實現. 分別使用結構化方法函數嵌套的方法。

system 是否 進行 如果 div 使用 clu 函數 整型 之前在main()函數中的思路是: #include <iostream> using namespace std; int main(){ //求四個數中最大的數? /