难度:⭐
题目描述:
给你一个整数 n
,请你返回 任意 一个由 n
个 各不相同 的整数组成的数组,并且这 n
个数相加和为 0
。
示例1:
1 | 输入:n = 5 |
示例2:
1 | 输入:n = 3 |
示例3:
1 | 输入:n = 1 |
提示:
1 <= n <= 1000
解题过程:
思路:
多种做法
方法一:可以把前面几个数加起来,最后一个数取之前所有元素和的相反数,
方法二:同时放入每个数和它的相反数,注意奇数时要放入0
c++代码:(执行用时4ms,击败43.73%,内存消耗7M,击败14.56%)
1 | class Solution { |
官方题解:
方法一:构造
我们首先将最小的 n - 1
个自然数 0, 1, 2, ..., n - 2
放入数组中,它们的和为 sum
。对于剩下的 1
个数,我们可以令其为 -sum
,此时这 n
个数的和为 0
,并且:
当 n = 1
时,我们构造的答案中只有唯一的 1
个数 0
;
当 n > 1
时,我们构造的答案中包含 n - 1
个互不相同的自然数和 1
个负数;
因此这 n
个数互不相同,即我们得到了一个满足要求的数组。
c++代码:(执行用时4ms,击败43.73%,内存消耗6.9M,击败20.06%)
1 | class Solution { |
复杂度分析
- 时间复杂度:$O(N)$。
- 空间复杂度:$O(1)$,除了存储答案的数组
ans
之外,额外的空间复杂度是 $O(1)$。
总结:
官方题解就是我思路里的第一种解法,哈哈哈😁,我使用的是第二种。还有就是c++可以直接在整数前加’-‘取相反数。