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; } }