我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 面試題61. 撲克牌中的順子 題目 從撲克牌中隨機抽5張牌,判 ...
我的LeetCode:https://leetcode-cn.com/u/ituring/
我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii
LeetCode 面試題61. 撲克牌中的順子
題目
從撲克牌中隨機抽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
著作權歸領扣網路所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題思路
思路1-判斷兩個條件即可(除0之外):是否有重覆的牌以及最大值與最小值差是否小於5
思路解析:因為牌的值範圍為[0,13],所以可以用一個int的bit用來記錄牌是否出現過,再用兩個int值記錄最大值與最小值即可;
需要註意的:
- min初始化為14,max初始化為0,即最值對調,這樣保證了即使5張牌都是大小王最後計算max-min時也能保證小於5;
演算法複雜度:
- 時間複雜度: $ {\color{Magenta}{\Omicron\left(n\right)}} $
- 空間複雜度: $ {\color{Magenta}{\Omicron\left(1\right)}} $
演算法源碼示例
package leetcode;
/**
* @author ZhouJie
* @date 2020年5月15日 下午11:37:48
* @Description: 面試題61. 撲克牌中的順子
*
*/
public class LeetCode_Offer_61 {
}
class Solution_Offer_61 {
/**
* @author: ZhouJie
* @date: 2020年5月15日 下午11:38:20
* @param: @param nums
* @param: @return
* @return: boolean
* @Description: 1-判斷是否有重覆和最小值與最大值差是否不大於4即可
*
*/
public boolean isStraight(int[] nums) {
int k = 0, min = 14, max = 0;
for (int val : nums) {
if (val != 0) {
// k的bit用來記錄牌是否出現過,第一次出現對應bit置為1,再次出現直接return
if ((k & (1 << val)) != 0) {
return false;
}
k |= (1 << val);
min = Math.min(min, val);
max = Math.max(max, val);
}
}
return max - min < 5;
}
}