我的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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/193095.html
標籤:Java
