剑指 offer 61 扑克牌中的顺子
排序+遍历
class Solution {
public boolean isStraight(int[] nums) {
//先排序
Arrays.sort(nums);
int count_zero = 0;
int lacks = 0;
for(int i=0;i<4;i++){
if(nums[i]==0){
count_zero++;
}
else{
if(nums[i]==nums[i+1]){
return false;
}
if(nums[i+1]-nums[i]!=1){
lacks+=nums[i+1]-nums[i]-1;
}
}
}
if(count_zero>=lacks){
return true;
}
return false;
}
}
时间复杂度
O
(
1
)
O(1)
O(1),要先对数组进行排序,排序的时间复杂度最小是
O
(
n
log
n
)
=
O
(
5
log
5
)
=
O
(
1
)
O(n \log n)=O(5 \log 5)=O(1)
O(nlogn)=O(5log5)=O(1)。
空间复杂度
O
(
1
)
O(1)
O(1),只有几个辅助变量。
集合Set+遍历
根据题意5张牌是顺子的充分条件如下:
- 出大小王外所有牌无重复
- 设这5张牌中最大的是
m
a
x
max
max,最小的是
m
i
n
min
min(大小王除外),则需要满足
m
a
x
−
m
i
n
<
5
max-min<5
max−min<5
因而可将问题转化为5张牌是否满足以上两个条件。
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> set = new HashSet<>();
int max = 0;
int min = 14;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
continue;
}
max = Math.max(max,nums[i]);
min =Math.min(min,nums[i]);
if(set.contains(nums[i])){
return false;
}
set.add(nums[i]);
}
if(max-min<5){
return true;
}
return false;
}
}