卡牌分组、分割数组--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]
提示:
- 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];
}
}
};
代码如有错误,欢迎大家指出!