Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เวลาที่ดีที่สุดในการซื้อและขายหุ้นด้วยคูลดาวน์ใน C++


สมมติว่าเรามีอาร์เรย์ที่องค์ประกอบ ith คือราคาของหุ้นที่กำหนดในวันที่ i เราต้องออกแบบอัลกอริทึมเพื่อหากำไรสูงสุด เราอาจทำธุรกรรมได้มากเท่าที่เราต้องการ (ดังนั้น ซื้อหนึ่งหุ้นและขายหุ้นหนึ่งหุ้นหลายๆ ครั้ง) แต่เราต้องปฏิบัติตามกฎเหล่านี้ –

  • เราไม่สามารถทำธุรกรรมหลายรายการพร้อมกันได้ (ดังนั้น เราต้องขายหุ้นก่อนที่คุณจะซื้ออีกครั้ง)
  • หลังจากที่เราขายหุ้นของเราแล้ว เราไม่สามารถซื้อหุ้นได้ในวันถัดไป (ใจเย็นๆ 1 วัน)

หากอินพุตเป็นเหมือน [1,2,3,0,2] ผลลัพธ์จะเป็น 3 ลำดับก็เหมือน [ซื้อ, ขาย, คูลดาวน์, ซื้อ, ขาย]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • endWithSell :=0, endWithBuy :=-ve infinity, prevBuy :=0 และ prevSell :=0
  • สำหรับ i :=0 ถึงขนาดของอาร์เรย์ที่กำหนด
    • prevBuy :=endWithBuy
    • endWithBuy :=สูงสุดของ endWithBuy และ prevSell – Arr[i]
    • prevSell :=endWithSell
    • endWithSell :=สูงสุดของ endWithSell และ prevBuy + Arr[i]
  • ผลตอบแทน endWithSell

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maxProfit(vector<int>& p) {
      int endWithSell = 0;
      int endWithBuy = INT_MIN;
      int prevBuy =0, prevSell = 0;
      for(int i =0;i<p.size();i++){
         prevBuy = endWithBuy;
         endWithBuy = max(endWithBuy,prevSell - p[i]);
         prevSell = endWithSell;
         endWithSell = max(endWithSell, prevBuy + p[i]);
      }
      return endWithSell;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,0,2};
   cout << (ob.maxProfit(v));
}

อินพุต

[1,2,3,0,2]

ผลลัพธ์

3