前往
大廳
主題

LeetCode - 932. Beautiful Array 解題心得

Not In My Back Yard | 2021-12-18 00:00:05 | 巴幣 0 | 人氣 233

題目連結:


題目意譯:
一個長度為 n 的陣列 nums 是漂亮的,如果:
nums 為範圍 [1, n] 的整數之一個排列。
對於每個 0 ≦ i < j < n,沒有任何索引值 k 滿足 i < k < j 且 2 × nums[k] == nums[i] + nums[j]。

給定整數 n,回傳任意一個長度 n 的漂亮陣列 nums。保證對於每個給定的 n 值至少會有一個合法答案。

限制:
1 ≦ n ≦ 1000



範例測資:
範例 1:
輸入: n = 4
輸出: [2,1,4,3]

範例 2:
輸入: n = 5
輸出: [3,1,2,5,4]


解題思維:
假設 a[n] 為長度 n 且符合所求條件的一個陣列。可以看到 a[1] = [1] 、 a[2] = [1, 2] 符合題意。

而對於 n > 2 的情況,將 [1, n] 這 n 個正整數排成奇數在前、偶數在後的形式。因為奇數 + 偶數只會是奇數,所以如果下式要成立
a[n][k] × 2 = a[n][i] + a[n][j]
則不會出現 a[n][i] 與 a[n][j] 奇偶性不同(即一奇一偶)的情況。而藉由奇數在前、偶數在後可以將整個陣列一分為二成左右兩邊(因為不會有 (i, j, k) 數組會跨區)。



此時奇數部分(假設有 X 個)為 1 、 3 、 5 、…… 、 2X-1,可以看到依序是第一個奇數、第二個奇數、……以此類推。

而這時我們又可以看到此時如果有 (i, j, k) 數對,則它們又會產生類似上述奇偶性應相同的性質。假設 (i, j, k) 分別對應的是第 a 、 b 、 c 個奇數,則 a + b = 2c。

而因為 a 、 b 、 c 是介於 1 ~ X 的數字。因此我們便可以將原先 X 個奇數一對一地重新映射到 [1, X] 範圍中。因此我們便可以遞迴地求得左半部(奇數)的解;同樣地,右半部(偶數)的解也可以按照類似的論述遞迴求得。



最後將兩半部的解(即 a[X] 和 a[n - X])結合,然後把左右兩邊各自的映射關係(因為此時左邊將是 1 ~ X 的一個排列,而不是奇數們 1 ~ 2X-1 的一個排列;右邊同理)反推回去便可以得到 a[n],即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作