剑指 Offer(第2版)面试题 61:扑克牌的顺子
剑指 Offer(第2版)面试题 61:扑克牌的顺子
题目来源:81. 扑克牌的顺子
解法1:排序
能组成顺子需要满足的两个条件是:
- 除了大小王(定义为 0)以外不能出现两个相同的数字;
- 排序后两个相邻数字的差值不能大于 0 的个数。
按照这两个条件进行判断即可。
代码:
class Solution
{
public:
bool isContinuous(vector<int> numbers)
{
// 特判
if (numbers.size() != 5)
return false;
// n = 5
int n = numbers.size();
sort(numbers.begin(), numbers.end());
int countZero = 0, countGap = 0;
// 统计数组中 0 的个数
for (int number : numbers)
if (number == 0)
countZero++;
// 统计数组中的间隔数目
int i = countZero, j = i + 1;
while (j < n)
{
// 有两张牌相同,不可能是顺子
if (numbers[i] == numbers[j])
return false;
countGap += numbers[j] - numbers[i] - 1;
i++;
j++;
}
return countZero >= countGap;
}
};
复杂度分析:
时间复杂度:O(N),其中 N 是数组 numbers 的长度,N = 5。
空间复杂度:O(1)。