[LeetCode] 1304. Find N Unique Integers Sum up to Zero 和为零的N个唯一整数
Given an integer n
, return any array containing n
unique integers such that they add up to 0
.
Example 1:
Input: n = 5
Output: [-7,-1,1,3,4]
Explanation: These arrays also are accepted [-5,-1,1,2,3] , [-3,-1,2,-2,4].
Example 2:
Input: n = 3
Output: [-1,0,1]
Example 3:
Input: n = 1
Output: [0]
Constraints:
1 <= n <= 1000
这道题给了一个正整数n,让返回一个长度为n的数组,要求是没有重复数字且数字之和为0。博主最先想到的办法就是根据数组的个数来做不同的处理,若n为偶数,说明数组正好可以平均分为两段,这样从1开始,加个1,加个 -1,然后加个2,加个 -2,都相互抵消了,凑够 n/2
对儿就可以了。若n为奇数,只要多加个0进去,既不会重复,又不会影响数字之和,就可以完成题目的要求了,参见代码如下:
解法一:
class Solution {
public:
vector<int> sumZero(int n) {
vector<int> res;
int half = n / 2;
if (n % 2 != 0) res.push_back(0);
for (int i = 1; i <= half; ++i) {
res.push_back(i);
res.push_back(-i);
}
return res;
}
};
再来看一种很类似的解法,这种是在数组的两端往中间更新,新建一个大小为n的数组,初始化均为0,两端分别赋值为1和 -1,然后往中间一步,赋值为2和 -2,直到中间的位置。若最中间只有一个数字,则保持为0不变,不会产生重复也不影响数字和,参见代码如下:
解法二:
class Solution {
public:
vector<int> sumZero(int n) {
vector<int> res(n);
int left = 0, right = n - 1, start = 1;
while (left < right) {
res[left++] = start;
res[right--] = -start;
++start;
}
return res;
}
};
再来看一种方法,从数组的第二个数字开始赋值为 1,2,3...,然后第一个位置放后面所有数字之和的相反数,这样整个数组和还是0,同样也可以达到要求,参见代码如下:
解法三:
class Solution {
public:
vector<int> sumZero(int n) {
vector<int> res(n);
for (int i = 1; i < n; ++i) {
res[i] = i;
res[0] -= i;
}
return res;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/1304
参考资料:
https://leetcode.com/problems/find-n-unique-integers-sum-up-to-zero/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2018-06-04 [LeetCode] 786. K-th Smallest Prime Fraction 第K小的质分数
2016-06-04 [LeetCode] Design Snake Game 设计贪吃蛇游戏
2015-06-04 stack, deque 和 queue的对比