leetcode 927. 三等分(腦洞題)
阿新 • • 發佈:2018-11-21
題目:
給一串01串,然後從中分開成三份,然後問有沒有可能組成三個二進位制是相同的。
思路:
看大佬的思路才做出來的。。。。一開始我都想用kmp了。。。。
結果,二進位制相同那麼肯定1的個數是相同的。那麼可以根據1的個數劃分一個大概的界限。
有了每個區間1的個數後,我們可以計算出:第一個區間的起點firone,第二個區間的起點firtwo,第三個區間的起點firthree。
三個區間的最後一個1的位置:lastone,lasttwo
然後我們還知道要二進位制數相同的話,那麼結尾的0的個數肯定是要相同的,結尾0的個數我們已經知道了,從最後一個區間可以算出來。即為lastz
然後我們要算的就只有【firone,lastone+lastz】【firtwo,lasttwo+lastz】【firtwo,結尾】這三個區間是不是相同的。
注意全為0的情況。
程式碼:
class Solution { public: vector<int> fail(){ vector<int>ans; ans.push_back(-1); ans.push_back(-1); return ans; } bool pan(vector<int>& A,int a,int b,int c,int len) //計算三個區間是不是相同 { for(int i=0;i<len;i++){ if(A[a+i]!=A[i+b]||A[i+b]!=A[i+c])return false; } return true; } vector<int> threeEqualParts(vector<int>& A) { int sz = A.size(); int num = 0; for(int i=0;i<sz;i++){ if(A[i])num++; } vector<int>ans; if(num%3!=0){ return fail(); } if(num==0){ //全0 ans.push_back(0); ans.push_back(2); return ans; } num = num/3; int lastone=-1,lasttwo=-1,firtwo=-1,firthree=-1,firstone = -1,lastz = -1; int ji = 0; for(int i=0;i<sz;i++){ if(firstone==-1&&A[i])firstone = i; if(A[i])ji++; if(ji==num&&lastone==-1)lastone = i; if(ji==num+1&&firtwo==-1)firtwo = i; if(ji==2*num&&lasttwo==-1)lasttwo = i; if(ji==2*num+1&&firthree==-1)firthree = i; if(ji==3*num)lastz++; } cout<<firstone<<" "<<lastone<<" "<<firtwo<<" "<<lasttwo<<" "<<firthree<<" "<<lastz<<endl; if(lastone+lastz>=firtwo||lasttwo+lastz>=firthree)return fail(); //不滿足字尾0 if(pan(A,firstone,firtwo,firthree,sz-firthree)){ ans.push_back(lastone+lastz); ans.push_back(lasttwo+1+lastz); return ans; } else return fail(); } };