執行結果:
通過
顯示詳情
執行用時 :36 ms, 在所有 Java 提交中擊敗了58.08% 的用戶
內存消耗 :41.8 MB, 在所有 Java 提交中擊敗了50.00%
題目:
輸入一個按升序排序的整數數組(可能包含重複數字),你需要將它們分割成幾個子序列,其中每個子序列至少包含三個連續整數。返回你是否能做出這樣的分割?
示例 1:
輸入: [1,2,3,3,4,5]
輸出: True
解釋:
你可以分割出這樣兩個連續子序列 :
1, 2, 3
3, 4, 5
示例 2:
輸入: [1,2,3,3,4,4,5,5]
輸出: True
解釋:
你可以分割出這樣兩個連續子序列 :
1, 2, 3, 4, 5
3, 4, 5
示例 3:
輸入: [1,2,3,4,4,5]
輸出: False
提示:
輸入的數組長度範圍爲 [1, 10000]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/split-array-into-consecutive-subsequences
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
思路:
採用貪心算法,優先和前面的組隊,因爲和後面的組隊會出現單獨的一個或者兩個
另外代碼中get方法改成getOrdefault方法,因爲直接用get可能會空指針
代碼:
class Solution {
public boolean isPossible(int[] nums) {
//用來記錄每個數字出現的次數
HashMap<Integer,Integer> numCount=new HashMap<>();
//用來計算以這個數結尾的連續的次數
HashMap<Integer,Integer> count=new HashMap<>();
for(int num:nums)
{
numCount.put(num,numCount.getOrDefault(num,0)+1);
}
for(int num:nums)
{
//如果爲0則跳過
if(numCount.getOrDefault(num,0)==0)
{
continue;
//如果大於0,並且前面有連續的,優先和前面組隊,因爲和後面組隊
//和可能出現一個和兩個的情況
}else if(count.getOrDefault(num-1,0)>0)
{
numCount.put(num,numCount.getOrDefault(num,0)-1);
count.put(num-1,count.getOrDefault(num-1,0)-1);
count.put(num,count.getOrDefault(num,0)+1);
//如果不能和前面組隊,那麼就和後面組隊
}else if(numCount.getOrDefault(num+1,0)>0&&numCount.getOrDefault(num+2,0)>0)
{
numCount.put(num,numCount.getOrDefault(num,0)-1);
numCount.put(num+1,numCount.getOrDefault(num+1,0)-1);
numCount.put(num+2,numCount.getOrDefault(num+2,0)-1);
count.put(num+2,count.getOrDefault(num+2,0)+1);
//i前面和後面都不能組隊,那麼它指定是單獨的了
}else
{
return false;
}
}
return true;
}
}