剑指 Offer 61. 扑克牌中的顺子
❤️来自专栏《LeetCode基础算法题》 欢迎订阅❤️
@[TOC]
关于作者
- 作者介绍
🍓 博客主页:作者主页
🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。
🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨💻。
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、总结
该题目的对特殊问题分析的能力,在题中出现大小王的处理,以及在遍历数组过程出现特殊情况结束循环等问题。