✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
题目描述
从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。
2∼10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,大小王可以看做任意数字。
为了方便,大小王均以 0 来表示,并且假设这副牌中大小王均有两张。
样例1
输入:[8,9,10,11,12] 输出:true样例2
输入:[0,8,9,11,12] 输出:true
方法一:排序+遍历 O(n)=O(5)=O(1)
思路如下:
- 先排除容器为空的情况,然后将所有数进行排序。
- 去掉
0,从前找到第一个非0的数。 - 除
0以外的数中不能出现重复的数字,不然不满足顺子要求。 - 最后再判断除
0以外的数中的最大值和最小值之差是否等于4,因为最多只有5张牌,如果差值超过4则无法用足够的0去填补(最多只有4个0)。例如,差值为5,那么非0的数占2个,即使剩下的3个数都为0,但至少也需要4个0才能填补构成顺子。
注意: 题目假设大小王各有两张,故最多可能出现
4个0。
class Solution {
public:
bool isContinuous(vector<int> numbers) {
if (numbers.empty()) return false;
sort(numbers.begin(), numbers.end());
//将0排除掉
int k = 0;
while (!numbers[k]) k++;
//不能出现相等的数
for (int i = k + 1; i < numbers.size(); i++)
if (numbers[i] == numbers[i - 1])
return false;
//最大值与最小值之差必须在4以内
return numbers.back() - numbers[k] <= 4;
}
};
欢迎大家在评论区交流~
480

被折叠的 条评论
为什么被折叠?



