😀前言
扑克牌顺子问题是一道趣味性与逻辑性兼备的题目,要求判断五张牌是否能组成顺子,其中大小王(癞子)可作为任意牌面。癞子的特殊性增加了问题的复杂度,也为解题提供了更多的可能性。通过这一问题,我们可以深入了解排序、计数以及差值计算在算法中的实际应用。
🏠个人主页:尘觉主页
文章目录
- [61. 扑克牌顺子](#61. 扑克牌顺子)
61. 扑克牌顺子
题目链接
问题描述
在扑克牌游戏中,顺子是指五张连续的牌(大小顺序不限)。题目要求给出五张牌,其中大小王(癞子)可以充当任何牌面(表示为 0),判断这五张牌是否能够组成顺子。为了更加清晰,我们先明确顺子的两个关键条件:
- 牌面不重复(癞子除外)。
- 最大牌和最小牌的差值小于 5(癞子可以填补间隙)。
解题思路
本题可以通过以下步骤实现:
1. 对数组进行排序
首先,对输入的数组进行排序。这样可以轻松计算非连续的间隙,并便于处理逻辑。
2. 统计癞子(大小王)的数量
遍历数组,统计牌面为 0 的牌的数量,即癞子数量 cnt
。
3. 判断是否满足顺子的条件
从非癞子牌开始遍历,依次检查两张相邻牌之间的差值。如果存在重复牌,直接返回 false
。否则,利用癞子填补两张牌之间的差值:
- 如果间隙大小大于癞子数量,则无法组成顺子;
- 否则,继续检查,直到所有牌都被验证。
4. 返回结果
最终,若癞子数量足够填补间隙,返回 true
;否则返回 false
。
代码实现
以下是基于上述思路的 Java 代码:
java
public boolean isContinuous(int[] nums) {
// 如果牌的数量少于5张,直接返回false
if (nums.length < 5)
return false;
// 对数组进行排序
Arrays.sort(nums);
// 统计癞子数量
int cnt = 0;
for (int num : nums) {
if (num == 0)
cnt++;
}
// 检查牌间的间隙,利用癞子进行填补
for (int i = cnt; i < nums.length - 1; i++) {
// 如果存在重复牌,返回false
if (nums[i + 1] == nums[i])
return false;
// 计算间隙大小,并用癞子填补
cnt -= nums[i + 1] - nums[i] - 1;
}
// 如果癞子足够填补间隙,则为顺子
return cnt >= 0;
}
代码解析
1. 排序数组
通过 Arrays.sort(nums)
,我们将数组按从小到大的顺序排列,使间隙的计算更加方便。
2. 统计癞子数量
通过遍历数组统计 nums
中的癞子数量 cnt
:
java
int cnt = 0;
for (int num : nums) {
if (num == 0)
cnt++;
}
3. 检查间隙并填补
从非癞子牌开始遍历,通过以下逻辑处理:
- 重复牌检查 :如果两张相邻牌相等,则无法形成顺子,直接返回
false
。 - 间隙填补 :计算间隙大小
nums[i + 1] - nums[i] - 1
,并减少癞子数量。
如果癞子数量不足以填补所有间隙,则返回 false
;否则,继续检查。
4. 返回结果
当遍历完成且癞子数量能够填补所有间隙时,返回 true
。
示例
以下是几个测试用例及其输出:
示例 1
输入:[1, 2, 3, 4, 5]
输出:true
解释:五张牌是连续的,不需要癞子。
示例 2
输入:[0, 0, 1, 2, 5]
输出:true
解释:两张癞子可以填补 3 和 4 的位置。
示例 3
输入:[0, 0, 2, 2, 5]
输出:false
解释:存在重复的非癞子牌,无法形成顺子。
时间和空间复杂度
- 时间复杂度:排序的时间复杂度为 O(nlogn),遍历数组的复杂度为 O(n)。因此总体复杂度为 O(nlogn)。
- 空间复杂度:排序时需要额外的存储空间,复杂度为 O(1)。
😄总结
通过本题,我们学习了如何结合排序和计数来解决扑克牌顺子问题。利用癞子的特殊性质,有效地填补间隙,最终判断是否满足顺子的条件。这一思路可以扩展到其他类似问题,如跳跃游戏或间隙填补问题。
😁热门专栏推荐
想学习vue的可以看看这个
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞