1. 程式人生 > 其它 >力扣競賽233場題解(三)

力扣競賽233場題解(三)

力扣競賽233場題解(三)

第一題:

題意:

根據一個不定長陣列,輸出 嚴格升陣列的最大數字和。

題解:

用最後結果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和優先佇列的區別。

     queue<int> q1;
q1.push(2);
q1.front() = 3;


priority_queue<int> q2;
q2.push(2);
q2.top() = 3;

因為cost value本身不能改變,但是可以複製給別人。

參看連結:https://leetcode-cn.com/problems/number-of-orders-in-the-backlog/solution/c-you-xian-dui-lie-by-raymond_yp-7p1k/

大根堆、小根堆和優先佇列的實現:https://blog.csdn.net/weixin_45697774/article/details/104481087