File tree Expand file tree Collapse file tree 2 files changed +94
-0
lines changed
1304-Find N Unique Integers Sum up to Zero Expand file tree Collapse file tree 2 files changed +94
-0
lines changed Original file line number Diff line number Diff line change 1+ # 1304. Find N Unique Integers Sum up to Zero
2+
3+ Given an integer ` n ` , return any array containing ` n ` unique integers such that they add up to ` 0 ` .
4+
5+ ** Constraints:**
6+
7+ - ` 1 <= n <= 1000 `
8+
9+ ## 基礎思路
10+
11+ 本題希望產生一組總和為 0 的整數陣列,且所有元素互不相同、長度為指定的正整數 ` n ` 。
12+
13+ 觀察後可以發現:
14+
15+ - 若將一個數與其相反數成對加入陣列(例如 3 與 -3),其總和為 0。
16+ - 所以只要建立 $\left\lfloor \frac{n}{2} \right\rfloor$ 對這樣的元素,即可保證部分和為 0。
17+ - 如果 ` n ` 是奇數,剩下 1 個位置就補上 ` 0 ` 即可(` 0 ` 不影響總和,同時是唯一的值,不與其他元素重複)。
18+
19+ 因此我們可以用如下策略:
20+
21+ - 產生從 ` 1 ` 到 ` n//2 ` 的正整數及其相反數。
22+ - 若 ` n ` 為奇數,再額外補上 ` 0 ` 。
23+
24+ 這樣能確保陣列長度為 ` n ` 且總和為 ` 0 ` ,且所有元素皆互不相同。
25+
26+ ## 解題步驟
27+
28+ ### Step 1: 初始化結果陣列
29+
30+ 建立一個空的結果陣列,用來儲存最終答案。
31+
32+ - 宣告空陣列 ` result ` 。
33+
34+ ``` typescript
35+ let result: number [] = [];
36+ ```
37+
38+ ### Step 2: 加入互為相反數的成對元素
39+
40+ 利用 for 迴圈,從 ` 1 ` 一直推進到 ` Math.floor(n / 2) ` ,將 ` i ` 與 ` -i ` 同時加入陣列中。
41+
42+ - 每次加入一對:正數與對應的負數
43+ - 加入總共 $\left\lfloor \frac{n}{2} \right\rfloor$ 對
44+
45+ ``` typescript
46+ for (let i = 1 ; i <= Math .floor (n / 2 ); i ++ ) {
47+ result .push (i , - i );
48+ }
49+ ```
50+
51+ ### Step 3: 若 ` n ` 為奇數,額外補上 0
52+
53+ 檢查 ` n ` 是否為奇數,若是,則將 ` 0 ` 加入陣列中(不影響總和,且保證唯一性)。
54+
55+ - 只在 ` n % 2 !== 0 ` 時加入 ` 0 `
56+
57+ ``` typescript
58+ if (n % 2 !== 0 ) {
59+ result .push (0 );
60+ }
61+ ```
62+
63+ ### Step 4: 回傳最終陣列
64+
65+ 回傳我們組合出來的陣列。
66+
67+ ``` typescript
68+ return result ;
69+ ```
70+
71+ ## 時間複雜度
72+
73+ - 產生 $\left\lfloor \frac{n}{2} \right\rfloor$ 對數值為 $O(n)$。
74+ - 額外補上 ` 0 ` 亦為 $O(1)$。
75+ - 總時間複雜度為 $O(n)$。
76+
77+ > $O(n)$
78+
79+ ## 空間複雜度
80+
81+ - 使用了額外長度為 $n$ 的結果陣列。
82+ - 總空間複雜度為 $O(n)$。
83+
84+ > $O(n)$
Original file line number Diff line number Diff line change 1+ function sumZero ( n : number ) : number [ ] {
2+ let result : number [ ] = [ ] ;
3+ for ( let i = 1 ; i <= Math . floor ( n / 2 ) ; i ++ ) {
4+ result . push ( i , - i ) ;
5+ }
6+ if ( n % 2 !== 0 ) {
7+ result . push ( 0 ) ;
8+ }
9+ return result ;
10+ }
You can’t perform that action at this time.
0 commit comments