剑指 Offer 61. 扑克牌中的顺子
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
1、题目📑
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
实例1:
输入: [1,2,3,4,5]
输出: True
实例2:
输入: [0,0,1,2,5]
输出: True
限制:
-
数组长度为 5数组的数取值为 [0, 13] .
2、思路🧠
方法一:遍历
- 执行排序操作
- 遍历整个数组
- 判断大王小王的位置,
nums[i] == 0碰到大王小王跳过本次的判断 - 判断重复元素,
nums[i] == nums[i + 1]
- 判断大王小王的位置,
- 用数组中最大的元素减去最小的元素和
5比较大小即可判断
方法二:哈希表遍历
- 遍历整个数组
- 判断大王小王的位置,
nums[i] == 0碰到大王小王跳过本次的判断 - 找到当前元素的最大值、最小值,直到数组全部遍历
- 判断集合中是否有重复元素,
set.contains(num)
- 判断大王小王的位置,
- 用定义的变量,找到最大的元素减去最小的元素与
5比较大小即可判断
废话少说~~~~~上代码!
3、代码👨💻
第一次commit AC
class Solution {
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int count = 0;
for(int i = 0; i < nums.length - 1; i++){
if(nums[i] == 0) {
count++;
}else if(nums[i] == nums[i + 1]) return false;
}
return nums[4] - nums[count] < 5;
}
}
时间复杂度:O(N) N为数组 nums 的长度
空间复杂度:O(1)
第二次commit AC
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> set = new HashSet<>();
int max = 0,min = 14;
for(int num : nums) {
if(num == 0) {
continue;
}
max = Math.max(max, num);
min = Math.min(min,num);
if(set.contains(num)) return false;
set.add(num);
}
return max - min < 5;
}
}
4、总结
该题目的对特殊问题分析的能力,在题中出现大小王的处理,以及在遍历数组过程出现特殊情况结束循环等问题。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!