659 分割陣列為連續子串行 貪心演算法 中等

2021-10-22 04:51:00 字數 4392 閱讀 2164

* 給你乙個按公升序排序的整數陣列 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

*

public

class

lk659

; system.out.

println

(ispossible2

(nums));

}public

static

boolean

ispossible

(int

nums)

// 使用貪心+標記儲存 --> 優先滿足讓更多的佇列大於等於3即可.否則就滿足等於2,否則就新增到大於等於3的佇列上,最後考慮新建立佇列(每次新建立的佇列都有可能讓結果為false所以最後考慮)

// 宣告乙個存放已經滿足佇列長度的map. key為佇列最後乙個數字.

map>> readymap =

newhashmap

<

>()

;// 宣告乙個存放還在增長的map. key為佇列最後乙個數字,大於三則移至readymap中

map>> growingmap =

newhashmap

<

>()

;// 宣告乙個初建立只有乙個元素的佇列儲存map

map>> createdmap =

newhashmap

<

>()

;for

(int i =

0; i< nums.length; i++

)// 新增完畢已經成長為三元素佇列,移除成長map至已準備好佇列. 並判斷當前成長佇列是否為空,為空則刪除當前map中該key

growinglist.

add(currentnum)

; list

> readlists = readymap.

getordefault

(currentnum,

newarraylist

<

>()

);readlists.

add(growinglist)

; readymap.

put(currentnum, readlists);}

else

if(createdmap.

containskey

(pre)

)// 新增完畢已經成長為二元素佇列,移除建立map至成長佇列. 並判斷當前佇列是否為空,為空則刪除當前map中該key

createdlist.

add(currentnum)

; list

> growinglists = growingmap.

getordefault

(currentnum,

newarraylist

<

>()

);growinglists.

add(createdlist)

; growingmap.

put(currentnum, growinglists);}

else

if(readymap.

containskey

(pre)

) readylist.

add(currentnum)

; list

> nextreadylists = readymap.

getordefault

(currentnum,

newarraylist

<

>()

);nextreadylists.

add(readylist)

; readymap.

put(currentnum, nextreadylists);}

else

}// 遍歷完還有growing的map則表示為false

return growingmap.

isempty()

&& createdmap.

isempty()

;}public

static

boolean

ispossible1

(int

nums)

// 使用貪心+標記儲存 --> 優先滿足讓更多的佇列大於等於3即可.否則就滿足等於2,否則就新增到大於等於3的佇列上,最後考慮新建立佇列(每次新建立的佇列都有可能讓結果為false所以最後考慮)

// 宣告乙個存放已經滿足佇列長度的map. key為佇列最後乙個數字.

mapreadymap =

newhashmap

<

>()

;// 宣告乙個存放還在增長的map. key為佇列最後乙個數字,大於三則移至readymap中

mapgrowingmap =

newhashmap

<

>()

;// 宣告乙個初建立只有乙個元素的佇列儲存map

mapcreatedmap =

newhashmap

<

>()

;for

(int i =

0; i< nums.length; i++

)else

// 新增完畢已經成長為三元素佇列,移除成長map至已準備好佇列. 並判斷當前成長佇列是否為空,為空則刪除當前map中該key

integer readlists = readymap.

getordefault

(currentnum,0)

; readlists +=1;

readymap.

put(currentnum, readlists);}

else

if(createdmap.

containskey

(pre)

)else

// 新增完畢已經成長為二元素佇列,移除建立map至成長佇列. 並判斷當前佇列是否為空,為空則刪除當前map中該key

integer growinglists = growingmap.

getordefault

(currentnum,0)

; growinglists +=1;

growingmap.

put(currentnum, growinglists);}

else

if(readymap.

containskey

(pre)

)else

integer nextreadylists = readymap.

getordefault

(currentnum,0)

; nextreadylists +=1;

readymap.

put(currentnum, nextreadylists);}

else

}// 遍歷完還有growing的map則表示為false

return growingmap.

isempty()

&& createdmap.

isempty()

;}// 最後大佬這個根據遞增規律. 根據每個位置和第乙個數的差值對映對應位置(如果是連續的則對應差值位置也連續)並將該位置+1; 如果有連續不為0的資料孤島小於3個的則會返回false

public

static

boolean

ispossible2

(int

nums)

for(

int i =

0; i(num<3)

for(

int j = i; j-i}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...