问题:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
思路1:排序
把数组排序,统计数组中0的个数,统计排序之后的数组中相邻数字之间的空缺总数。
如果空缺总数小于等于0的个数,则是顺子,否则不是。
另外,如果有对子出现,则不是顺子。
代码:
class Solution {
public:
bool IsContinuous( vector<int>& numbers ) {
if(numbers.empty())
return false;
sort(numbers.begin(),numbers.end());
int numOf0=0;
for(int i=0;i<4;++i)
{
if(numbers[i]==0)
{
numOf0++;
continue;
}
if(numbers[i+1]==numbers[i])
return false;
numOf0-=numbers[i+1]-numbers[i]-1;
}
if(numOf0>=0)
return true;
else
return false;
}
};
复杂度分析:时间复杂度为O(1),空间复杂度为O(1).
思路2:不排序.
找到最大值和最小值(跳过0),如果最大值-最小值+1>5,则有0也不可能构成顺子,如果最大值-最小值+1<=5,则能构成顺子,0填在合适的位置即可。
此外,利用数组判断是否存在重复数字。
class Solution {
public:
bool isStraight(vector<int>& nums) {
bool m[15];
memset(m, 0, sizeof(m));
int minValue = 14, maxValue = 0;
for (int item : nums) {
if (item == 0) {
continue;
}
if (m[item]) {
return false;
}
m[item] = true;
minValue = min(minValue, item);
maxValue = max(maxValue, item);
}
return maxValue - minValue + 1 <= 5;
}
};
复杂度分析:时间复杂度为O(1),空间复杂度为O(1).