import java.util.*;
public class Solution {
public boolean IsContinuous(int [] numbers) {
//时间复杂度为O(1) 因为numbers就5张扑克牌 所以不满足题目要求的时间复杂度 以及空间复杂度
// return method1(numbers);
return method2(numbers);
}
public boolean method1 (int [] numbers) {
if(numbers.length == 0){
return false;
}
//大小王算:0 A-K 1-13
int[] cards = new int[14];
//5张排 不重复 如:45678 max=8 min=4 max - min一定<5
int max = -1;
int min = 14;
//标记是否有重复牌
boolean flg = false;
//利用hash桶思想 cards数组初始化14位都为0
//遍历numbers 每放进去一位cards对应都位置+1
//如果numbers后续发现 其中某位置上的值>1 那么代表这5张扑克numbers中有重复值
for(int i=0;i<numbers.length;i++){
cards[numbers[i]] += 1;
//如果是大小王 那么直接跳出 进行下一次循环
if(numbers[i] == 0){
continue;
}
if(cards[numbers[i]] > 1){
flg = true;
break;
}
if(numbers[i] > max){
max = numbers[i];
}
if(numbers[i] < min){
min = numbers[i];
}
}
//如果最大值-最小值<5 && 没有重复牌
if(max - min <5 && !flg){
return true;
}
return false;
}
public boolean method2 (int [] numbers) {
if(numbers.length == 0){
return false;
}
//快排 所以满足时间复杂度nlogn
Arrays.sort(numbers);
//1 2 3 4 5 每2个数直接的差为1 加起来<=4就满足 因为还有可能是大小王0的 所以时小于等于
int minusSum = 0;
//没有其他空间 所以满足空间复杂度O(1)
for (int i = 0; i < numbers.length - 1; i++) {
if (numbers[i] == 0) {
continue;
} else if (numbers[i] == numbers[i+1]) {
return false;
} else {
minusSum += numbers[i+1] - numbers[i];
}
}
if (minusSum <= 4) {
return true;
}
return false;
}
}