Skip to content

Commit 1d4c52f

Browse files
committed
Add: Add 2025/9/7
1 parent b641b4b commit 1d4c52f

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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)$
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
}

0 commit comments

Comments
 (0)