1. 程式人生 > >說你有一個數組,其中第i個元素是第i天給定股票的價格。設計一個演算法來找到最大的利潤,最多可以完成兩個交易。

說你有一個數組,其中第i個元素是第i天給定股票的價格。設計一個演算法來找到最大的利潤,最多可以完成兩個交易。

用四個變數來表示倆次交易的買入賣出,遍歷陣列,比較每次交易的利益,儲存最大的。

    int maxProfit(vector<int> &prices) {
        int len=prices.size();
        if(len==0)
            return 0;
        
        int buy1=INT_MIN;
        int sell1=0;
        int buy2=INT_MIN;
        int sell2=0;
        //表示經過當前操作後的最大profit
        for(int i=0;i<len;i++){
            buy1=max(buy1,-prices[i]);
            sell1=max(sell1,buy1+prices[i]);
            buy2=max(buy2,sell1-prices[i]);
            sell2=max(sell2,buy2+prices[i]);
        }
        return sell2;
    }
2  左右掃描 分別計算出 i 之前 pre[]和 之後 post[] 的最大利潤 ,在 i 處為分割  求出最大交易
    int maxProfit(vector<int> &prices) {
        int len=prices.size();
        if(len==0)
            return 0;
        vector<int> pre(len);
        vector<int> post(len);
        int minPrice=prices[0];
       // pre[0]=prices[0];
        for(int i=1;i<len;i++){
            minPrice=min(minPrice,prices[i]);
            pre[i]=max(pre[i-1],prices[i]-minPrice);
        }
        int maxPrice=prices[len-1];
      //  post[len-1]=prices[len-1];
        for(int i=len-2;i>=0;i--){
            maxPrice=max(maxPrice,prices[i]);
        	post[i]=max(post[i+1],maxPrice-prices[i]);
        }      
        int maxProfit=0;
        for(int i=0;i<len;i++){
            maxProfit=max(maxProfit,pre[i]+post[i]);
        }
        return maxProfit;        
    }

 如果不限交易次數 則 遍歷陣列

    int maxProfit(vector<int> &prices) {
        int len=prices.size();
        if(len==0||len==1)
            return 0;
        int profit=0;
        for(int i=1;i<len;i++){
            int sum=prices[i]-prices[i-1];
            if(sum>0)
                profit+=sum;
        }
        return profit;
    }

------------------------------------------------------------

如果只可以交易一次,則找出差值最大的即可

 int maxProfit(vector<int> &prices) {
        int len=prices.size();
        if(len==0||len==1)
            return 0;
        int maxProfit=0;
        for(int i=0;i<len-1;i++){
            int price=prices[i];
            for(int j=i+1;j<len;j++){
                int profit=prices[j]-price;
                if(profit>maxProfit){
                    maxProfit=profit;
                }
            }
        }
        return maxProfit;
    }

解2:
    int maxProfit(vector<int> &prices) {
        int len=prices.size();
        if(len==0||len==1)
            return 0;
        int maxProfit=0;
        int minPrice=prices[0];
        for(int i=1;i<len;i++){
        	minPrice=min(minPrice,prices[i]);  //找出最低價格
            maxProfit=max(maxProfit,prices[i]-minPrice); //計算最大差值
        }
        return maxProfit;
    }




相關推薦

個數其中i元素i給定股票價格設計一個演算法找到利潤可以完成交易

用四個變數來表示倆次交易的買入賣出,遍歷陣列,比較每次交易的利益,儲存最大的。 int maxProfit(vector<int> &prices) { int len=prices.size(); if(len

個數由正整數、負整數、零組成求和的連續子陣列

$arr = [-11,1,111,-120,1,1,1,-55,-1,21,-1,1,1,1,1,-55,-1,130,1,1,-1]; // 歷史最大 $log_arr = [ 'start_item' => 0, 'value' => 0, 'end

設計一個getMin功能的棧,如果面試官讓個數一定不要用指標去管理new出來原生的陣列那就是在給自己挖坑

//設計實現一個getMin功能的棧 #include <iostream> #include <stack> using namespace std; class GetMinStack { public:     void push(int x)

每天一道LeetCode-----買賣商品問題計算利潤分別交易交易交易的情況

Best Time to Buy and Sell Stock 給定一個價格序列prices,其中prices[i]代表第i天商品的價格,商家需要在某一天買入,然後在之後的某一天出售,計算可以獲得的最大利潤 本質就是計算prices[i]−price

Java總雜湊表的運用判斷個數中是否存在相同的元素之間的距離在k以內!

Check if a given array contains duplicate elements within k distance from each other 用雜湊表,複雜度O(n),

如何消除個數裏面重復的元素

前端入門 初級前端 // 方法一:var arr1 =[1,2,2,2,3,3,3,4,5,6],arr2 = [];for(var i = 0,len = arr1.length; i< len; i++){if(arr2.indexOf(arr1[i]) < 0){arr2.push(

js簡單演算法(二)如何去除個數中與另個數中的值相同的元素

codewars上面6kyu的演算法題,下面是演算法題的英文簡介 Your goal in this kata is to implement an difference function, which subtracts one list from another. I

給定個數它的 i 元素給定股票 i 價格 如果只允許完成交易(即買入和賣出股票設計一個算法計算所能獲取的利潤

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

個數怎麼模擬出A陣列的第一元素B第二元素以此類推

choiceoptinfo:["<p>6時30分</p>", "<p>6時50分</p>", "<p>6時</p>"]  有這樣一個數組。他是一個題目的選項。 我們要寫成下面這個圖片的樣式。字數比較少的時候,一行兩

面試題:給定個數陣列中只包含0和1請找到一個長的子序列其中0和1的數量是相同的

這個題目,看起來比較簡單,一些同學可能認為題目的描述符合動態規劃的特徵,然後就開始用動態規劃解,努力找狀態轉移方程。這些同學的感覺,是很正確的。但,找狀態轉移方程,我們要對原來的陣列進行變換一下。 原來是0和1的串,我們將0都換為-1。這樣題目目標就變成,找到一個最長的子串,子串數字和是0。設原陣列為A

php 通過curl獲取遠程數據返回的是個數型的字符串高手幫忙如何將這個數類型的字符串變成數

bsp 選項 con 獲取 pan 如果 clas exe transfer 如 Array([0] => Array([0] => Array([kd_status] => 已簽收[kd_time] => 2014-04-30 18:59:43 [

給定個數其中出現奇數次的元素

package com.yzcl.test; public class JiShu { public static void main(String[] args) { //給定一個含有n個元素的整型陣列a,例如{1,1,2,4,3,3,1},找出其中出現奇數次的元素,並列印,輸出:1,

給定個數其中只有個數出現別的數都出現3次出這個數(go)

1.思路 用兩個數one=0、two=0分別記錄bits位上1出現的次數,如果一個數出現一次,則one等於這個數,two=0;  如果一個數出現兩次,則two等於這個數, one等於0;如果一個數出現第三次,則one = 0, two = 0 ,three等於這個數。 我們以陣

個數物件裡面傳值如果id已經存在就替換id同一個物件裡面的另一個沒有就新增

<div  @click='choiceAnswer1(item ,keyindex)'  v-for="(item,keyindex) in arrayData">{{item}}</div>   choiceAnswer1(d

給定個數A[0,1,...,n-1],請構建個數B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]不能使用除法

題目描述 給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 /* 思路:題目要求B的i個元素等於A中除了i個元素所以元素乘積 因此思路很清

給定個數個數(該數不一定在陣列中)從數裡刪掉這個數字返回剩下的陣列長度

給定一個數組和一個數(該數不一定在陣列中),從數組裡刪掉這個數字,返回剩下的陣列長度。 如:A[] = {1, 2, 3, 4, 5}要刪除數字 3,那麼返回陣列長度為 4。 親愛的小夥伴們,題目是不是很簡單呢? 提示:int removeElement(int

個數開始的若干元素搬到陣列的末尾我們稱之為陣列的旋轉 輸入一個非減排序的陣列的一個旋轉輸出旋轉陣列的元素

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。 /*

個數中只有數字是出現其他所有數字都出現了 出這數字程式設計實現

1.一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 #include<stdio.h> #include<stdio.h> int main() { int arr[] = { 1, 3, 8, 1,