卡牌分組、分割陣列--LeetCode Contest 104
阿新 • • 發佈:2018-11-19
卡牌分組
給定一副牌,每張牌上都寫著一個整數。
此時,你需要選定一個數字 X,使我們可以將整副牌按下述規則分成 1 組或更多組:
- 每組都有 X 張牌
- 組內所有的牌上都寫著相同的整數。
僅當你可選的 X >= 2 時返回 true。
class Solution { public: bool hasGroupsSizeX(vector<int>& deck) { int length=deck.size(),a[10000],i,j; for(i=0;i<10000;i++) //記錄數字的個數陣列,初始化所有數字個數為0 a[i]=0; for(i=0;i<length;i++) //deck裡面有哪些數字,對應的a[]下標的a[]數值增加 a[deck[i]]++; sort(a,a+10000); //排序 for(i=0;i<10000;i++) //記錄第一個非0的下標 if(a[i]!=0) break; int temp=a[i]; //把陣列中0的部分去掉 if(temp==1) //判斷最小的相同數字的個數是否為1 return false; else{ for(int j=2;j<=temp;j++){ //暴力破解,求所有個數情況的公共因數,若存在,return true int p=1; //不存的話就 return false; for(int k=i;k<10000;k++) if(a[k]%j!=0){ p=0; break; } if(p==1) return true; } } return false; } };
分割陣列
給定一個數組 A,將其劃分為兩個不相交(沒有公共元素)的連續子陣列 left 和 right, 使得
- left 中的每個元素都小於或等於 right 中的每個元素。
- left 和 right 都是非空的。
- left 要儘可能小。
在完成這樣的分組後返回 left 的長度。可以保證存在這樣的劃分方法。
示例1
輸入:[5,0,3,8,6]
輸出:3
解釋:left = [5,0,3],right = [8,6]
示例2
輸入:[1,1,1,0,6,12]
輸出:4
解釋:left = [1,1,1,0],right = [6,12]
提示:
- 2 <= A.length <= 30000
- 0 <= A[i] <= 10^6
- 可以保證至少有一種方法能夠按題目所描述的那樣對 A 進行劃分。
int dfs(vector<int> A,int i){ //判斷在該處的位置是否可以分割 sort(A.begin(),A.begin()+i+1); //排序0-i下標的數值 sort(A.begin()+i+1,A.end()); //排序i+1-end()下標的數值 if(A[i]<=A[i+1]) //若left的最大值小於或等於right的最小值 return 1; //符合條件返回1 else return 0; //不符合條件返回0 } class Solution { public: int partitionDisjoint(vector<int>& A) { int length=A.size(),max=A[0]; for(int i=1;i<length;i++) //遍歷所有可能分割的位置 if(max<=A[i]) //分割位置的後一個數肯定要大於left的最大值 { if(dfs(A,i-1)) return i; max=A[i]; } } };
程式碼如有錯誤,歡迎大家指出!