leetcode 第 217 場周賽(vivo)
class Solution {
public:
vector<int> mostCompetitive(vector<int>& a, int k) {
int n=a.size(),*s=new int[n+1],top=0;
vector<int>ans;
for(int i=0;i<n;++i){
while(top&&a[s[top]]>a[i]&&n-i+top-1>=k) --top;//要保證未曾入棧元素+棧裡元素>=k
s[++top]=i;
}
int l=1;
while(k--) ans.push_back(a[s[l++]]);//棧裡前k個就是要求的序列
return ans;
}
};
差分
一定要注意的是nums[i]<=limit !!!
接下來就是差分,看target落在sum數軸哪個點,操作次數最少了。
class Solution {
public:
int sum[400000];
int minMoves(vector<int>& nums, int limit) {
int n=nums.size(),mx=0;
for(int i=0;i<n/2;++i){
int a=nums[i],b=nums[n-i-1];
if(a>b) swap(a,b);
mx=max(mx,b);
sum[1]+=2;
--sum[1+a],--sum[a+b];
++sum[a+b+1],++sum[b+limit+1];
}
int ans=n;
for(int i=2;i<=mx+limit;++i) sum[i]+=sum[i-1],ans=min(ans,sum[i]);
return ans;
}
};
思維 我確實想不出來
我承認我解釋的很牽強,還不是因為我不能證明,只能感覺。
奇數只能變化一次,那就是*2,偶數可以變化好幾次,直到一直/2得到奇數了,如12->6->3; 那我們 [4,1,5,20,3] 可以變成[4,2,10,20,6] 變成[2,4,6,10,20],這樣變很好理解,因為這樣不會導致結果發生變化。 對於[2,4,6,10,20]這個序列,不變化的話偏移量為20-2=18. 我們想得到更小的偏移量,怎麼變化這個序列呢? 能想到的就是[2,4,6,10,10] (為什麼不前面的元素比如10,6除以2)呢,因為前面的元素除以2 也可以由[2,4,6,10]變過去, 然後 變成[2,4,5,6]-->[2,3,4,5],這時候就不能繼續變化了。
1. 首先5前面偶數/2沒有意義,最大值一直是5,前面/2可能會導致最小值更小,進而偏移量更大
2. 5*2 行嗎,5*2不就變回去了我們之前考慮過的序列或者捨棄不考慮的序列了嗎
變成考慮過的序列很好理解,變成被捨棄的序列是什麼意思呢?
比如[2,3,4,5]-->[2,3,4,10]就是由[2,4,6,10]變得,6/2不如10/2;
class Solution {
public:
int minimumDeviation(vector<int>& nums) {
int n=nums.size();
set<int>s;
for(int i=0;i<n;++i) s.insert((nums[i]&1)?nums[i]*2:nums[i]);
int ans=*s.rbegin()-*s.begin();
while(s.size()>=1&&(*s.rbegin())%2==0){
int x=*s.rbegin();
s.erase(x),s.insert(x/2);
ans=min(ans,*s.rbegin()-*s.begin());
}
return ans;
}
};
相關文章
- Leetcode第 217 場周賽(思維量比較大)LeetCode
- LeetCode第215場周賽LeetCode
- [leetcode 第 400 場周賽]題解LeetCode
- Leetcode 第136場周賽解題報告LeetCode
- 第191場周賽
- 第 210 場周賽
- AcWing第85場周賽
- Leetcode周賽119LeetCode
- leetcode周賽 - 406LeetCode
- 20201125:力扣第216場周賽(下)力扣
- 20201124:力扣第216場周賽(上)力扣
- 第 178 場力扣周賽 第二題力扣
- LeetCode 第 196 場周賽 (題目:5452-5455,這是參加過最坑的周賽,暴力n^2居然可以過)LeetCode
- LeetCode 第 42 場雙週賽 ( rank 514 / 1578 )LeetCode
- 【leetcode 399 周賽】【題解】LeetCode
- 20241027LeetCode421周賽LeetCode
- 前端工程師的 LeetCode 之旅 -- 周賽 182前端工程師LeetCode
- CSDN周賽第35期:贏《阿里雲天池大賽賽題解析―深度學習篇》和定製周邊阿里深度學習
- CSDN周賽第47期:贏《C primer plus 第6版中文版》和定製周邊
- 第 8 場 小白入門賽
- CSDN周賽第51期:贏《C++ Primer Plus 第6版 中文版》和定製周邊C++
- CSDN周賽第36期:贏熱門實體圖書《演算法競賽》和定製周邊演算法
- CSDN周賽第29期:贏實體書《演算法競賽》和定製周邊等禮品演算法
- CSDN周賽第48期:贏《MongoDB核心原理與實踐》和定製周邊MongoDB
- CSDN周賽第33期:贏實體圖書盲盒和定製周邊
- CSDN周賽第34期:贏《MongoDB核心原理與實踐》和定製周邊MongoDB
- 【CSDN程式設計周賽第17期】贏熱門圖書《演算法競賽》和定製周邊程式設計演算法
- 河南萌新聯賽2024第(一)場
- CSDN周賽第41期:贏《動手學深度學習(PyTorch版)》和定製周邊深度學習PyTorch
- CSDN周賽第38期:贏《Spring Boot+Vue開發實戰》和定製周邊Spring BootVue
- 藍橋杯第9場小白入門賽
- 2024 ICPC 網路預選賽 第 2 場
- 河南萌新聯賽2024第(三)場(部分)
- 河南萌新聯賽2024第(二)場 (CDEG)
- CSDN周賽第45期:贏《Python程式設計快速上手 讓繁瑣工作自動化 第2版》和定製周邊Python程式設計
- CSDN周賽第50期:贏《PowerBI商業資料分析專案實戰》和定製周邊
- CSDN周賽第30期:贏圖書《軟體研發效能提升實踐》和定製周邊
- 【CSDN競賽第24期】贏熱門圖書《演算法競賽》和定製周邊演算法