卡牌分组、分割数组--LeetCode Contest 104

版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/weixin_41969587,未经博主允许不得转载。 https://blog.csdn.net/weixin_41969587/article/details/82907379

卡牌分组

给定一副牌,每张牌上都写着一个整数。

此时,你需要选定一个数字 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];
        }
    }
};

代码如有错误,欢迎大家指出!

猜你喜欢

转载自blog.csdn.net/weixin_41969587/article/details/82907379
104