方法一:朴素模拟法——king补充空位
public class Solution {
public boolean IsContinuous(int [] numbers) {
int[] count = new int[14];//0~13,普通牌卡槽
int kingCount = 0;
for(int i=0; i<=4; ++i){
if(numbers[i] == 0){
++kingCount;
}
else{
if(count[numbers[i]] == 1)return false;//有重复,直接false,不可能同花顺了
count[numbers[i]] = 1;
}
}
int num =0;//连续个数
for(int i=1; i<=13; ++i){//遍历count[]数组
if(count[i] == 1) ++num;
else if(num!=0 || num<i-8){//补位:普通补位+末尾补位(i>=9 && num<i-8时,即使末尾没有牌,也要提前用king的情况)
if(kingCount == 0)return false;
else{
--kingCount;
++num;
}
}
if(num == 5)return true;//及时
}
return false;
}
}//时间O(1) 空间O(1)
//这题由于输入的规模是固定的,所以复杂度全部是O(1)
//但性能上还是有差异:方法二略优于方法一 方法二:利用特性——普通卡不重复时,max-min<=4即可
public class Solution {
public boolean IsContinuous(int [] numbers) {
int count[] = new int[14];//正好对应0-13的卡牌(卡牌号->次数)
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;//把min设置为最大,max设置最小
for(int i=0; i<5; ++i){
if(numbers[i]!=0){//0不参加
if(++count[numbers[i]] > 1)return false;//保证普通牌无重复
if(numbers[i] > max) max=numbers[i];
if(numbers[i] < min) min=numbers[i];
}
}
return (max-min<=4) ? true : false;//注意三元运算符的写法(三元运算符返回的是两个值二选一)
}
}//时间O(1) 空间O(1) 查重:上面是用数组,下面是用Set
import java.util.HashSet;
public class Solution {
public boolean IsContinuous(int [] numbers) {
HashSet<Integer> set = new HashSet<Integer>();//HashSet
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i=0; i<5; ++i){
if(numbers[i]!=0){
if(!set.add(numbers[i]))return false;//HashSet
if(numbers[i] > max) max=numbers[i];
if(numbers[i] < min) min=numbers[i];
}
}
return (max-min<=4) ? true : false;
}
}//时间O(1) 空间O(1) 
京公网安备 11010502036488号