'LeetCode基礎算法題第1103. Distribute Candies to People'

算法 Java Python C語言 最後一個人 吾是我師 2019-08-17
"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

LeetCode基礎算法題第1103. Distribute Candies to People

(i是每個人在數組中的下標數,t表示分配到的次數)

來看代碼:

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

LeetCode基礎算法題第1103. Distribute Candies to People

(i是每個人在數組中的下標數,t表示分配到的次數)

來看代碼:

LeetCode基礎算法題第1103. Distribute Candies to People

根據上面的公式,求出n的值,直接將浮點數轉換成整型,就是下取整。

然後求出次數d和餘數r,注意d是所有人至少能分到的次數,上圖實例中d等於2,即每個人至少能分到兩次。r表示前r個人會被多分1次

last就是上面公式中的last,即剩餘的糖果數。

我們先直接計算前r個人,這部分人分配到的次數是d+1, 所以每個人分到的糖果總數為:

(i+1)*(d+1) + num_people*(d+1)*d/2

然後再算r後面的人,這部分人被分到d次,所以每個人分到的數量是:

(i+1)*d + num_people*(d-1)*d/2

最後last應該分配給第r+1個人,他在數組中的下標是r,加上去即可。

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

LeetCode基礎算法題第1103. Distribute Candies to People

(i是每個人在數組中的下標數,t表示分配到的次數)

來看代碼:

LeetCode基礎算法題第1103. Distribute Candies to People

根據上面的公式,求出n的值,直接將浮點數轉換成整型,就是下取整。

然後求出次數d和餘數r,注意d是所有人至少能分到的次數,上圖實例中d等於2,即每個人至少能分到兩次。r表示前r個人會被多分1次

last就是上面公式中的last,即剩餘的糖果數。

我們先直接計算前r個人,這部分人分配到的次數是d+1, 所以每個人分到的糖果總數為:

(i+1)*(d+1) + num_people*(d+1)*d/2

然後再算r後面的人,這部分人被分到d次,所以每個人分到的數量是:

(i+1)*d + num_people*(d-1)*d/2

最後last應該分配給第r+1個人,他在數組中的下標是r,加上去即可。

LeetCode基礎算法題第1103. Distribute Candies to People

Java語言實現:

Java 的實現和C語言的實現一致,不再撰述。

代碼如下:

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

LeetCode基礎算法題第1103. Distribute Candies to People

(i是每個人在數組中的下標數,t表示分配到的次數)

來看代碼:

LeetCode基礎算法題第1103. Distribute Candies to People

根據上面的公式,求出n的值,直接將浮點數轉換成整型,就是下取整。

然後求出次數d和餘數r,注意d是所有人至少能分到的次數,上圖實例中d等於2,即每個人至少能分到兩次。r表示前r個人會被多分1次

last就是上面公式中的last,即剩餘的糖果數。

我們先直接計算前r個人,這部分人分配到的次數是d+1, 所以每個人分到的糖果總數為:

(i+1)*(d+1) + num_people*(d+1)*d/2

然後再算r後面的人,這部分人被分到d次,所以每個人分到的數量是:

(i+1)*d + num_people*(d-1)*d/2

最後last應該分配給第r+1個人,他在數組中的下標是r,加上去即可。

LeetCode基礎算法題第1103. Distribute Candies to People

Java語言實現:

Java 的實現和C語言的實現一致,不再撰述。

代碼如下:

LeetCode基礎算法題第1103. Distribute Candies to People

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

LeetCode基礎算法題第1103. Distribute Candies to People

(i是每個人在數組中的下標數,t表示分配到的次數)

來看代碼:

LeetCode基礎算法題第1103. Distribute Candies to People

根據上面的公式,求出n的值,直接將浮點數轉換成整型,就是下取整。

然後求出次數d和餘數r,注意d是所有人至少能分到的次數,上圖實例中d等於2,即每個人至少能分到兩次。r表示前r個人會被多分1次

last就是上面公式中的last,即剩餘的糖果數。

我們先直接計算前r個人,這部分人分配到的次數是d+1, 所以每個人分到的糖果總數為:

(i+1)*(d+1) + num_people*(d+1)*d/2

然後再算r後面的人,這部分人被分到d次,所以每個人分到的數量是:

(i+1)*d + num_people*(d-1)*d/2

最後last應該分配給第r+1個人,他在數組中的下標是r,加上去即可。

LeetCode基礎算法題第1103. Distribute Candies to People

Java語言實現:

Java 的實現和C語言的實現一致,不再撰述。

代碼如下:

LeetCode基礎算法題第1103. Distribute Candies to People

LeetCode基礎算法題第1103. Distribute Candies to People

Python語言實現:

Python 的實現和C語言的實現一致,不再撰述。

代碼如下:

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

LeetCode基礎算法題第1103. Distribute Candies to People

(i是每個人在數組中的下標數,t表示分配到的次數)

來看代碼:

LeetCode基礎算法題第1103. Distribute Candies to People

根據上面的公式,求出n的值,直接將浮點數轉換成整型,就是下取整。

然後求出次數d和餘數r,注意d是所有人至少能分到的次數,上圖實例中d等於2,即每個人至少能分到兩次。r表示前r個人會被多分1次

last就是上面公式中的last,即剩餘的糖果數。

我們先直接計算前r個人,這部分人分配到的次數是d+1, 所以每個人分到的糖果總數為:

(i+1)*(d+1) + num_people*(d+1)*d/2

然後再算r後面的人,這部分人被分到d次,所以每個人分到的數量是:

(i+1)*d + num_people*(d-1)*d/2

最後last應該分配給第r+1個人,他在數組中的下標是r,加上去即可。

LeetCode基礎算法題第1103. Distribute Candies to People

Java語言實現:

Java 的實現和C語言的實現一致,不再撰述。

代碼如下:

LeetCode基礎算法題第1103. Distribute Candies to People

LeetCode基礎算法題第1103. Distribute Candies to People

Python語言實現:

Python 的實現和C語言的實現一致,不再撰述。

代碼如下:

LeetCode基礎算法題第1103. Distribute Candies to People

"

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。

如果有任何問題可以在文章後評論或者私信給我。

如果有朋友希望我講些其他話題,請在評論區留言或者私信給我。

持續分享,敬請關注。

LeetCode 1103. 分糖果(Distribute Candies to People)

問題描述:

我們用下面的方法把一些糖果順序分發給num_people個人:

我們給第一個人1塊糖,給第二個人2塊糖,以此類推,直到我們給最後一個人n塊糖。

然後,我們再從頭開始分,給第一個人n + 1塊糖,給第二個人n + 2塊糖,以此類推,直到我們給最後一個人2 * n塊糖。

這個過程不斷重複(我們每次多給一個糖果,當我們分到隊伍的最後面時,再重新回到隊伍的最前面開始分),直到糖果分完。

最後一個人會收到我們所有剩餘的糖果(不一定比之前的禮物多一個)返回長度為num_people的數組,每個元素記錄最終每個人分到的糖果數量。

注:

  • 1 <= candies <= 10^9;
  • 1 <= num_people <= 1000;

示例:

LeetCode基礎算法題第1103. Distribute Candies to People

C語言實現:

題目中candies的長度最大可以達到10^9,這是一個很大的數,我不希望像題目描述的那樣一個個分。

我希望能找到一種方法,不依賴candies的值,僅僅依賴num_people的值,畢竟num_people要小的多。

我們注意觀察分配的過程,如下面的示例:

LeetCode基礎算法題第1103. Distribute Candies to People

我們發現如果將分配的過程串聯起來,除去除去紅色以及後面的部分,每次分配的數量就是一個差為1的等差數列。那麼我可以得到:

LeetCode基礎算法題第1103. Distribute Candies to People

n為等差數列的長度,即為黃色部分的長度,我們僅僅需要知道n的最大取值,所以是下取整;last為最後剩餘的糖果,即上面紅色元素的值。

而對於每一個人,他得到糖果總數與num_people的值,即人數,和分配的次數有關。(暫時不考慮是否會包含last)

num_people是已知的。關於次數,我們發現並不是每個人都一樣的,比如上面最後一個人只被分配了兩次,而其他人是三次。我們可以通過 n/num_people 和 n%num_people 來計算每個人的次數,後面我們結合代碼來說明。

再回到計算每個人分到的糖果總數,其實也是一個等差數量,差是num_people。比如上面第一個人分到的是(1,6,11)第二個人分到的是(2,7,12)。用公式表示就是:

LeetCode基礎算法題第1103. Distribute Candies to People

(i是每個人在數組中的下標數,t表示分配到的次數)

來看代碼:

LeetCode基礎算法題第1103. Distribute Candies to People

根據上面的公式,求出n的值,直接將浮點數轉換成整型,就是下取整。

然後求出次數d和餘數r,注意d是所有人至少能分到的次數,上圖實例中d等於2,即每個人至少能分到兩次。r表示前r個人會被多分1次

last就是上面公式中的last,即剩餘的糖果數。

我們先直接計算前r個人,這部分人分配到的次數是d+1, 所以每個人分到的糖果總數為:

(i+1)*(d+1) + num_people*(d+1)*d/2

然後再算r後面的人,這部分人被分到d次,所以每個人分到的數量是:

(i+1)*d + num_people*(d-1)*d/2

最後last應該分配給第r+1個人,他在數組中的下標是r,加上去即可。

LeetCode基礎算法題第1103. Distribute Candies to People

Java語言實現:

Java 的實現和C語言的實現一致,不再撰述。

代碼如下:

LeetCode基礎算法題第1103. Distribute Candies to People

LeetCode基礎算法題第1103. Distribute Candies to People

Python語言實現:

Python 的實現和C語言的實現一致,不再撰述。

代碼如下:

LeetCode基礎算法題第1103. Distribute Candies to People

LeetCode基礎算法題第1103. Distribute Candies to People


"

相關推薦

推薦中...