725 分隔鍊錶(小朋友分蘋果問題)

2021-10-02 22:05:46 字數 2697 閱讀 3627

給定乙個頭結點為 root 的鍊錶, 編寫乙個函式以將鍊錶分隔為 k 個連續的部分。

每部分的長度應該盡可能的相等: 任意兩部分的長度差距不能超過 1,也就是說可能有些部分為 null。

這k個部分應該按照在鍊錶**現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。

返回乙個符合上述規則的鍊錶的列表。

舉例: 1->2->3->4, k = 5 // 5 結果 [ [1], [2], [3], [4], null ]

示例 1:

輸入: 

root = [1, 2, 3], k = 5

輸出: [[1],[2],[3],,]

解釋:輸入輸出各部分都應該是鍊錶,而不是陣列。

例如, 輸入的結點 root 的 val= 1, root.next.val = 2, \root.next.next.val = 3, 且 root.next.next.next = null。

第乙個輸出 output[0] 是 output[0].val = 1, output[0].next = null。

最後乙個元素 output[4] 為 null, 它代表了最後乙個部分為空鍊錶。

示例 2:

輸入: 

root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3

輸出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]

解釋:輸入被分成了幾個連續的部分,並且每部分的長度相差不超過1.前面部分的長度大於等於後面部分的長度。

root 的長度範圍: [0, 1000].

輸入的每個節點的大小範圍:[0, 999].

k 的取值範圍: [1, 50].

不妨把問題是轉為給小朋友分蘋果,那麼問題就變成了,第幾號小朋友拿多少個蘋果?

但是一次分配看不出規律,所以,我們可以兩次分配。先均分,再分剩下的,看看有沒有什麼規律。

蘋果len=10,小朋友k=3,先每人分3個,剩1個,再分,分給第1號小朋友1個,分給第2,3,…,10號小朋友每人0個 。

蘋果len=39,小朋友k=7,先每人分5個,剩4個,再分,分給第1,2,3,4號小朋友每人1個,分給第5,…,10號小朋友每人0個 。

蘋果len=97,小朋友k=17,先每人分5個,剩12個,再分,分給第1,2,3,…,12號小朋友每人1個,分給13,14,15,16,17號小朋友每人0個。

所以,核心公式為,第幾號小朋友拿多少個蘋果 = 均分數 + (小朋友號數小於剩餘蘋果數,拿 1 個,大於拿0個)。

那小朋友數量比這一堆蘋果的個數還要多,怎麼辦?上面的公式也是合適的。

蘋果len=3,小朋友k=5,先每人分0個,剩3個,再分,分給第1,2,3號小朋友1個,分給第4,5號小朋友每人0個 。

蘋果len=7,小朋友k=9,先每人分0個,剩7個,再分,分給第1,2,3,…,7號小朋友1個,分給第8,9號小朋友每人0個 。

所以跟官方的一樣。

遍歷一下鍊錶,得到鍊錶的長度(一堆蘋果有幾個)

採用除法計算出均分數(均分幾個蘋果),採用取模計算出餘數(剩下幾個蘋果)

k次迴圈,生成乙個臨時鍊錶,計算核心公式,當前小朋友分多少個蘋果size = 均分數 + (小朋友號數 < 剩餘蘋果數? 1 : 0)

size次迴圈,取出size個listnode,注意邊界,新增到listnode陣列

返回listnode陣列

class

solution

int width = n / k, rem = n % k;

listnode[

] ans =

newlistnode

[k];

cur = root;

for(

int i =

0; i < k;

++i)

ans[i]

= dummy.next;

}return ans;

}}

演算法:

在方法 1 中,我們知道每個部分的大小。我們將不建立新列表,而是直接拆分原鍊錶,並根據需要返回指向原始鍊錶中節點的指標列表。

package split_linked_list_in_parts;

import common.listnode;

public

class

solution2

int width = n / k, rem = n % k;

listnode[

] ans =

newlistnode

[k];

cur = root;

for(

int i =

0; i < k;

++i)

if(cur != null)

ans[i]

= temp;

}return ans;

}public

static

void

main

(string[

] args)

}

725 分隔鍊錶

1.求出鍊錶的長度len 2.len k求出平均每段鍊錶的長度,len k求出多出平均長度的個數 3.把每段鍊錶的頭指標存入結果陣列 definition for singly linked list.struct listnode class solution int mod len k int ...

725 分隔鍊錶

給定乙個頭結點為 root 的鍊錶,編寫乙個函式以將鍊錶分隔為 k 個連續的部分。每部分的長度應該盡可能的相等 任意兩部分的長度差距不能超過 1,也就是說可能有些部分為 null。這k個部分應該按照在鍊錶 現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。返回乙個符合上述規則的鍊錶...

LeetCode 725 分隔鍊錶

給定乙個頭結點為 root 的鍊錶,編寫乙個函式以將鍊錶分隔為 k 個連續的部分。每部分的長度應該盡可能的相等 任意兩部分的長度差距不能超過 1,也就是說可能有些部分為 null。這k個部分應該按照在鍊錶中出現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。返回乙個符合上述規則的鍊...