1304. 和为零的N个唯一整数『简单』

题目来源于力扣(LeetCode

一、题目

1304. 和为零的N个唯一整数

题目相关标签:数组

提示:

  • 1 <= n <= 1000

二、解题思路

2.1 双指针

  1. 通过左右指针来向结果数组中添加元素

  2. 元素每次减 1,且左指针索引上总是保存元素的负数形式

  3. 右指针索引上总是保存元素的正数形式

  4. 保证了结果数组元素的相加为 0 和元素的唯一性

2.2 数学方式

  1. 创建长度为 n 的数组,遍历 n - 1 次

  2. 遍历数组,使保证了结果元素的相加为 0 和元素的唯一性

  3. 定义变量 sum 用于记录索引的和

  4. 结束遍历后,令数组的最后一位元素为变量 sum 的负数形式

  5. 保证了结果数组元素的相加为 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));
}
posted @ 2020-06-08 22:11  知音12138  阅读(224)  评论(0编辑  收藏  举报