分割陣列為連續子串行

2021-10-11 07:44:37 字數 1594 閱讀 7817

題目:

給你乙個按公升序排序的整數陣列 num(可能包含重複數字),請你將它們分割成乙個或多個子串行,其中每個子串行都由連續整數組成且長度至少為 3 。

如果可以完成上述分割,則返回 true ;否則,返回 false 。

示例 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

思路&&方法:貪心

對於陣列中的元素 x,如果存在乙個子串行以 x−1 結尾,則可以將 x 加入該子串行中。將 x 加入已有的子串行總是比新建乙個只包含 x 的子串行更優,因為前者可以將乙個已有的子串行的長度增加 1,而後者新建乙個長度為 1 的子串行,而題目要求分割成的子串行的長度都不小於 3,因此應該盡量避免新建短的子串行。

基於此,可以通過貪心的方法判斷是否可以完成分割。

使用兩個雜湊表,第乙個雜湊表儲存陣列中的每個數字的剩餘次數,第二個雜湊表儲存陣列中的每個數字作為結尾的子串行的數量。

初始時,每個數字的剩餘次數即為每個數字在陣列**現的次數,因此遍歷陣列,初始化第乙個雜湊表。

在初始化第乙個雜湊表之後,遍歷陣列,更新兩個雜湊表。只有當乙個數字的剩餘次數大於 0 時,才需要考慮這個數字是否屬於某個子串行。假設當前元素是 x,進行如下操作。

首先判斷是否存在以 x-1 結尾的子串行,即根據第二個雜湊表判斷 x-1 作為結尾的子串行的數量是否大於 0,如果大於 0,則將元素 x 加入該子串行中。由於 x 被使用了一次,因此需要在第乙個雜湊表中將 x 的剩餘次數減 1。又由於該子串行的最後乙個數字從 x-1 變成了 x,因此需要在第二個雜湊表中將 x-1 作為結尾的子串行的數量減 1,以及將 x 作為結尾的子串行的數量加 1。

否則,x為乙個子串行的第乙個數,為了得到長度至少為 3的子串行,x+1 和 x+2 必須在子串行中,因此需要判斷在第乙個雜湊表中 x+1 和 x+2 的剩餘次數是否都大於 0。

當 x+1 和 x+2 的剩餘次數都大於 0 時,可以新建乙個長度為 3 的子串行 [x,x+1,x+2]。由於這三個數都被使用了一次,因此需要在第乙個雜湊表中將這三個數的剩餘次數分別減 1。又由於該子串行的最後乙個數字是 x+2,因此需要在第二個雜湊表中將 x+2 作為結尾的子串行的數量加 1。

否則,無法得到長度為 3 的子串行 [x,x+1,x+2],因此無法完成分割,返回false。

如果整個陣列遍歷結束時,沒有遇到無法完成分割的情況,則可以完成分割,返回 true。

class

solution

for(

auto

& x:nums)

else

else}}

}return

true;}

};

659 分割陣列為連續子串行

貪心 按數字大小的順序,盡量將當前數字與之前產生的數鏈連線在一起。考慮1 2 3 4 4 5 5 6這樣一組數字,遍歷到第二個4的時候,就應該檢測能不能再組成一條新的數鏈,這時就把6給從count中減掉了,盡可能避免剩下短鏈。class solution else if tails.get x 0 ...

659 分割陣列為連續子串行

給你乙個按公升序排序的整數陣列 num 可能包含重複數字 請你將它們分割成乙個或多個子串行,其中每個子串行都由連續整數組成且長度至少為 3 如果可以完成上述分割,則返回 true 否則,返回 false 貪心演算法 思路分析 分析i時,先查詢有沒有以i 1結尾的子串行,有則接著,沒有則需要新建長度最...

659 分割陣列為連續子串行

給你乙個按公升序排序的整數陣列 num 可能包含重複數字 請你將它們分割成乙個或多個子串行,其中每個子串行都由連續整數組成且長度至少為 3 如果可以完成上述分割,則返回 true 否則,返回 false 示例 1 輸入 1,2,3,3,4,5 輸出 true 解釋 你可以分割出這樣兩個連續子串行 1...