1. 程式人生 > >卡牌分組、分割陣列--LeetCode Contest 104

卡牌分組、分割陣列--LeetCode Contest 104

卡牌分組

給定一副牌,每張牌上都寫著一個整數。

此時,你需要選定一個數字 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]

提示:

  1. 2 <= A.length <= 30000
  2. 0 <= A[i] <= 10^6
  3. 可以保證至少有一種方法能夠按題目所描述的那樣對 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];
        }
    }
};

程式碼如有錯誤,歡迎大家指出!