1. 程式人生 > 實用技巧 >leetcode 659 分割陣列為連續子序列

leetcode 659 分割陣列為連續子序列

package com.example.lettcode.dailyexercises;

import java.util.HashMap;
import java.util.Map;

/**
 * @Class IsPossible
 * @Description 659 分割陣列為連續子序列
 * 給你一個按升序排序的整數陣列 num(可能包含重複數字),請你將它們分割成一個或多個子序列,其中每個子序列都由連續整陣列成且長度至少為 3 。
 * 如果可以完成上述分割,則返回 true ;否則,返回 false 。
 * <p>
 * 示例 1:
 * 輸入: [1,2,3,3,4,5]
 * 輸出: True
 * 解釋:
 * 你可以分割出這樣兩個連續子序列 :
 * 1, 2, 3
 * 3, 4, 5
 * <p>
 * 示例 2:
 * 輸入: [1,2,3,3,4,4,5,5]
 * 輸出: True
 * 解釋:
 * 你可以分割出這樣兩個連續子序列 :
 * 1, 2, 3, 4, 5
 * 3, 4, 5
 * <p>
 * 示例 3:
 * 輸入: [1,2,3,4,4,5]
 * 輸出: False
 * <p>
 * 提示:
 * 輸入的陣列長度範圍為 [1, 10000]
 * Related Topics 堆 貪心演算法
 * @Author
 * @Date 2020/12/4
 **/
public class IsPossible {
    public static boolean isPossible(int[] nums) {
        if (nums == null || nums.length < 3) return false;
        Map<Integer, Integer> integerMap = new HashMap<>();
        // 儲存每個整數出現的次數
        for (int num : nums) {
            integerMap.put(num, integerMap.getOrDefault(num, 0) + 1);
        }

        for (int num : nums) {
            int subNum = 0;         // 子陣列的個數
            int p = 1;              // 表示當前元素出現的總次數
            int next = num;         // 下一個連續整數
            // 判斷上一個元素出現的次數是否超過下一個元素出現的次數,不超過則說明至少有一個子序列是不會同時包含兩個元素的
            while (integerMap.getOrDefault(next, 0) >= p) {
                p = integerMap.get(next);
                integerMap.put(next, p - 1);
                subNum++;
                next++;
            }
            if (subNum > 0 && subNum < 3) return false;
        }
        return true;
    }
}
// 測試用例
public static void main(String[] args) {
	int[] nums = new int[]{1, 2, 3, 3, 4, 5};
	boolean ans = isPossible(nums);
	System.out.println("IsPossible demo01 result:" + ans);

	nums = new int[]{1, 2, 3, 3, 4, 4, 5, 5};
	ans = isPossible(nums);
	System.out.println("IsPossible demo02 result:" + ans);

	nums = new int[]{1, 2, 3, 3, 4, 5};
	ans = isPossible(nums);
	System.out.println("IsPossible demo03 result:" + ans);

	nums = new int[]{1, 2, 4, 5, 8, 9};
	ans = isPossible(nums);
	System.out.println("IsPossible demo04 result:" + ans);

	nums = new int[]{1,2,3,4,4,5};
	ans = isPossible(nums);
	System.out.println("IsPossible demo05 result:" + ans);
}