package Leetcode;

import java.util.ArrayList;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Iterator;

/**
 * 给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。
 * 如果可以完成上述分割,则返回 true ;否则,返回 false 。
 */
public class fenge {
    public static void main(String[] args) {
        int []nums={0,1,2,3,3,4,5};
        // int[] nums = { -5, -5, -4, -4, -3 };
        System.out.println(isPossible(nums));
    }
    /**
     * 这个只能到最长结尾
     * @param nums
     * @return
     */
    public static boolean isPossible1(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])) {
                map.put(nums[i], map.get(nums[i]) + 1);
            } else {
                map.put(nums[i], 1);
            }
        }

        int[] counts = new int[map.size()];
        for (Integer i : map.keySet()) {
            counts[i - nums[0]] = map.get(i);
        }
        List<List<Integer>> list = new ArrayList<>();

        while (map.size() != 0) {
            List<Integer> r = new ArrayList<>();
            for (Integer i : map.keySet()) {
                
                if (map.get(i) == 0) {
                    continue;
                }
                r.add(i);
                map.put(i, map.get(i) - 1);
            }
            Iterator<Entry<Integer, Integer>> it = map.entrySet().iterator();
            while(it.hasNext()){  
                Entry<Integer, Integer> entry = it.next();
            if(entry.getValue() == 0)  
                it.remove();//使用迭代器的remove()方法删除元素  
            }  
            
            if(r.size()<3){
                
                continue;
            }
            int flag=0;
            Collections.sort(r);
            for(int i=1;i<r.size();i++){
                if(r.get(i)-r.get(i-1)!=1){
                    flag=1;
                    break;
                }
            }
            if(flag==1){
                
                continue;
            }
            
            list.add(r);
            
        }
        if(list.size()>=2){
            return true;
        }
        return false;

    }
    /**
     * 思路:用tail记录结束位置为i的序列个数
     * 1.如果当前的后面两个都存在,以后面第三个结尾+1
     * 2.如果当前的前面一个结尾的长度不为0,把当前的附在前一个上
     * 3.否则false
     */
    public static boolean isPossible(int[] nums){
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])) {
                map.put(nums[i], map.get(nums[i]) + 1);
            } else {
                map.put(nums[i], 1);
            }
        }
        Map<Integer,Integer> tail=new HashMap<Integer,Integer>();
        for(int i:nums){
            int count=map.getOrDefault(i, 0);
            if(count<=0){
                continue;
            }else if(tail.getOrDefault(i-1, 0)>0){
                map.put(i, count-1);
                tail.put(i-1, tail.get(i-1)-1);
                tail.put(i, tail.getOrDefault(i,0)+1);
            }else if(map.getOrDefault(i+1, 0)>0&&map.getOrDefault(i+2, 0)>0){
                map.put(i,count-1);
                map.put(i+1,map.get(i+1)-1);
                map.put(i+2,map.get(i+2)-1);
                tail.put(i+2, tail.getOrDefault(i+2, 0)+1);

            }else{
                return false;
            }
        }
        return true;
    }
}