题目描述
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。
为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。
样例
输入:[8,9,10,11,12]
输出:true
算法1
(模拟)
- 边界情况
- 排序
- 因为0是特殊情况,所以删掉0
- 去重
- 如果没有0,max-min是4,如果有0,1个0,剩下的4个有序,max-min是3,如果有2个0,剩下的3个有序,max-min是2
时间复杂度
$O(n)$
C++ 代码
class Solution {
public:
bool isContinuous( vector<int> A ) {
if(A.empty()) return false;
sort(A.begin(), A.end());
vector<int> B;
for(auto x : A)
if(x != 0)
B.push_back(x);
for(int i = 0; i < B.size(); i ++)
{
int j = i + 1;
if(B[j] == B[i]) return false;
}
int mine = *min_element(B.begin(), B.end());
int maxe = *max_element(B.begin(), B.end());
if(maxe - mine <= 4) return true;
else return false;
}
};
class Solution {
public:
bool isContinuous( vector<int> A ) {
if(A.empty()) return false;
sort(A.begin(), A.end());
vector<int> B;
for(auto x : A)
if(x != 0)
B.push_back(x);
for(int i = 0; i < B.size(); i ++)
{
int j = i + 1;
if(B[j] == B[i]) return false;
}
int mine = *min_element(B.begin(), B.end());
int maxe = *max_element(B.begin(), B.end());
if(maxe - mine <= 4 && maxe - mine >= 2) return true;
else return false;
}
};
算法2
(模拟)
时间复杂度
$O(n)$
C++ 代码
class Solution {
public:
bool isContinuous( vector<int> A ) {
if(A.empty()) return false;
sort(A.begin(), A.end());
int k = 0;
while(!A[k]) k ++;
/*
for(int i = k; i < A.size(); i ++)
{
int j = i + 1;
if(A[i] == A[j]) return false;
}
*/
for(int i = k + 1; i < A.size(); i ++)
if(A[i] == A[i - 1])
return false;
return A.back() - A[k] <= 4;
}
};