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] .
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 解题思路
- 方法:排序➕遍历
根据题意,此 5 张牌是顺子的 充分条件 如下:
(1)除大小王外,所有牌 无重复 ;
(2)设此 5 张牌中最大的牌为 max ,最小的牌为 min (大小王除外),则需满足:max−min<5
因而,可将问题转化为:此 5 张牌是否满足以上两个条件?
- 算法分析
(1)先对数组执行排序。
(2)判别重复: 排序数组中的相同元素位置相邻,因此可通过遍历数组,判断 nums[i]=nums[i+1] 是否成立来判重。
(3)获取最大 / 最小的牌: 排序后,数组末位元素 nums[4] 为最大牌;元素 nums[count] 为最小牌,其中 count 为大小王的数量。 - 复杂度分析:
时间复杂度 =O(NlogN)=O(5log5)=O(1) : 其中 N 为 nums 长度,本题中 N≡5 ;数组排序使用 O(NlogN) 时间。
空间复杂度 O(1) : 变量 joker 使用 O(1) 大小的额外空间。
作者:jyd
链接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/solution/mian-shi-ti-61-bu-ke-pai-zhong-de-shun-zi-ji-he-se/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3 解决代码
- 方法:排序➕遍历《Java代码》
class Solution {
public boolean isStraight(int[] nums) {
//如果重复,肯定错误。 如果不存在0,则最大值最小值之差必定为4
//其他情况,最大值最小值之差小于4即可
int count = 0;
// 数组排序
Arrays.sort(nums);
for(int i = 0; i < 4; i++){
// 统计大小王数量
if(nums[i] == 0){
count++;
}
// 若有重复,提前返回 false
else if(nums[i] == nums[i + 1]){
return false;
}
}
// 最大牌 - 最小牌 < 5 则可构成顺子
// if(nums[4] - nums[count] < 5){
// return true;
// }
// return false;
return nums[4] - nums[count] < 5;
}
}
- 方法:排序➕遍历《python3代码》
class Solution:
def isStraight(self, nums: List[int]) -> bool:
count = 0
# 数组排序
nums.sort()
for i in range(4):
# 统计大小王数量
if nums[i] == 0:
count += 1
# 若有重复,提前返回 false
elif nums[i] == nums[i + 1]:
return False
# 最大牌 - 最小牌 < 5 则可构成顺子
return nums[4] - nums[count] < 5