力扣競賽233場題解(三)
阿新 • • 發佈:2021-06-22
第一題:
題意:
根據一個不定長陣列,輸出 嚴格升陣列的最大數字和。
題解:
用最後結果sum和最後的最大值進行比較,並用? : 語句進行迴圈內部的處理,書寫更加簡潔。
程式碼:
1 class Solution { 2 public: 3 int maxAscendingSum(vector<int>& nums) { 4 int ans=0; 5 int sum=0; 6 for(int i=0;i<nums.size();i++) 7 { 8 sum = (i!=0&& nums[i]>nums[i-1]) ? sum+nums[i] : nums[i]; 9 ans=max(ans,sum); 10 11 } 12 return ans; 13 14 } 15 };
第二題:
題目:https://leetcode-cn.com/problems/number-of-orders-in-the-backlog/
題意:
求積壓訂單中的訂單總數。
題解:
優先佇列,不斷維護佇列。預設是大根堆;取反是小根堆。
程式碼:
1 typedef pair<int,int> PII; 2 3 class Solution { 4 public: 5 int getNumberOfBacklogOrders(vector<vector<int>>& orders) { 6 priority_queue<PII> buy,sell; 7 int mod =1e9+7; 8 long long ans = 0 ; 9 10 //當buy>=sell,匹配的時候 11 for(auto &i : orders)12 { 13 if(i[2]==0) //優先佇列預設大根堆,數字從大到小輸出的。 14 { 15 buy.push({i[0],i[1]}); 16 } 17 else 18 { 19 sell.push({-i[0],i[1]}); 20 } 21 ans += i[1]; 22 while(!buy.empty()) 23 { 24 if(sell.empty() || -sell.top().first > buy.top().first) 25 { 26 break; 27 } 28 PII x = buy.top(); 29 buy.pop(); 30 PII y = sell.top(); 31 sell.pop(); 32 //匹配成功 33 int cha = min(x.second,y.second); 34 x.second -=cha; 35 y.second -=cha; 36 ans -= 2*cha; 37 if(x.second) 38 { 39 buy.push(x); 40 } 41 else 42 { 43 sell.push(y); 44 } 45 } 46 47 }return ans% mod; 48 } 49 };
queue<int> q1;
q1.push(2);
q1.front() = 3;
priority_queue<int> q2;
q2.push(2);
q2.top() = 3;
因為cost value本身不能改變,但是可以複製給別人。
大根堆、小根堆和優先佇列的實現: