Easy
题目描述
给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数的和为 0 。
示例 1:
输入:n = 5
输出:[-7,-1,1,3,4]
解释:这些数组也是正确的 [-5,-1,1,2,3],[-3,-1,2,-2,4]。
示例 2:
输入:n = 3
输出:[-1,0,1]
示例 3:
输入:n = 1
输出:[0]
约束条件:
1 <= n <= 1000
提示:
- 返回一个对称的数组(+x,-x)。
- 如果 n 是奇数,在返回的数组中添加值 0。
解题思路
这是一个构造题,我们需要找到 n 个不同的整数使其和为 0。
核心思路:
利用对称性构造数组。对于任意一对数字 x 和 -x,它们的和为 0。
解法分析:
对称构造法(推荐):
- 当 n 为偶数时:构造 n/2 对相反数,如 [1, -1, 2, -2, …]
- 当 n 为奇数时:先构造 (n-1)/2 对相反数,然后加上 0
累加构造法:
- 前 n-1 个数使用 1, 2, 3, …, n-1
- 最后一个数设为前面所有数的相反数之和
- 这样能保证总和为 0 且所有数不同
两种方法都能满足要求,对称构造法更直观易懂,代码实现也更简洁。
具体实现:
- 使用循环构造前 n/2 对相反数
- 如果 n 是奇数,最后添加 0
- 时间复杂度 O(n),空间复杂度 O(1)(不考虑输出数组)
代码实现
class Solution {
public:
vector<int> sumZero(int n) {
vector<int> result;
// 添加成对的相反数
for (int i = 1; i <= n / 2; i++) {
result.push_back(i);
result.push_back(-i);
}
// 如果 n 是奇数,添加 0
if (n % 2 == 1) {
result.push_back(0);
}
return result;
}
};
class Solution:
def sumZero(self, n: int) -> List[int]:
result = []
# 添加成对的相反数
for i in range(1, n // 2 + 1):
result.append(i)
result.append(-i)
# 如果 n 是奇数,添加 0
if n % 2 == 1:
result.append(0)
return result
public class Solution {
public int[] SumZero(int n) {
List<int> result = new List<int>();
// 添加成对的相反数
for (int i = 1; i <= n / 2; i++) {
result.Add(i);
result.Add(-i);
}
// 如果 n 是奇数,添加 0
if (n % 2 == 1) {
result.Add(0);
}
return result.ToArray();
}
}
var sumZero = function(n) {
const result = [];
if (n % 2 === 1) {
result.push(0);
}
for (let i = 1; i <= Math.floor(n / 2); i++) {
result.push(i, -i);
}
return result;
};
复杂度分析
| 复杂度 | 分析 |
|---|---|
| 时间复杂度 | O(n) - 需要遍历生成 n 个数字 |
| 空间复杂度 | O(1) - 不考虑输出数组的额外空间 |