leetcode 659 分割陣列為連續子序列
阿新 • • 發佈:2020-12-04
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); }