题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
提示:
- 1 <= n <= 1000
二、解题思路
2.1 双指针
-
通过左右指针来向结果数组中添加元素
-
元素每次减 1,且左指针索引上总是保存元素的负数形式
-
右指针索引上总是保存元素的正数形式
-
保证了结果数组元素的相加为 0 和元素的唯一性
2.2 数学方式
-
创建长度为 n 的数组,遍历 n - 1 次
-
遍历数组,使保证了结果元素的相加为 0 和元素的唯一性
-
定义变量 sum 用于记录索引的和
-
结束遍历后,令数组的最后一位元素为变量 sum 的负数形式
-
保证了结果数组元素的相加为 0 和元素的唯一性
三、代码实现
3.1 双指针
public static int[] sumZero(int n) {
// 声明 n 位元素的数组
int[] res = new int[n];
int left = 0;
int right = res.length - 1;
int j = n / 2; // 折半
// 左右指针对数组进行赋值
while (left < right) {
res[left++] = -j; // 左侧存负数
res[right--] = j; // 右侧存正数
j--; // 数值每次减 1
}
return res;
}
3.2 数学方式
public static int[] sumZero2(int n) {
// 声明 n 位元素的数组
int[] res = new int[n];
int sum = 0;
for (int i = 0; i < res.length - 1; i++) {
sum += i;
res[i] = i;
}
// 最后一位为其前面全部元素的总结的负数形式,即全部元素相加为 0
res[res.length - 1] = -sum;
return res;
}
四、执行用时
4.1 双指针
4.2 数学方式
五、部分测试用例
public static void main(String[] args) {
int n = 5; // output:{-7, -1, 1, 3, 4}
// int n = 3; // output:{-1, 0, 1}
// int n = 1; // output:{0}
int[] result = sumZero(n);
System.out.println(Arrays.toString(result));
}