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