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。

解法分析:

  1. 对称构造法(推荐)

    • 当 n 为偶数时:构造 n/2 对相反数,如 [1, -1, 2, -2, …]
    • 当 n 为奇数时:先构造 (n-1)/2 对相反数,然后加上 0
  2. 累加构造法

    • 前 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) - 不考虑输出数组的额外空间