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