宝宝也能看懂的 leetcode 周赛 - 169 - 1

1304. Find N Unique Integers Sum up to Zero

Hi 你们好,我是张小猪。欢迎来到『宝宝也能看懂』系列之 leetcode 题解。git

这里是第 169 期的第 1 题,也是题目列表中的第 1304 题 -- 『Find N Unique Integers Sum up to Zero』github

题目描述

Given an integer n, return any array containing n unique integers such that they add up to 0.shell

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:post

Input: n = 1
Output: [0]

Constraints:优化

1 <= n <= 1000

官方难度

EASYspa

解决思路

题目内容很简单,返回一个符合要求的数组便可,要求包含几点:code

  • 长度是 n
  • 不能有重复的数字
  • 全部数字和为 0

看完要求以后,我第一反应就是,一正一负不就正好是 0 咯。ip

直接方案

基于以上思路,咱们能够获得一个直接的解题方案。须要注意的是,对于奇数来讲,再额外补充一个 0 便可。

我这里的代码额外作了一点小优化,即经过一个定长的数组来避免数组自动伸缩带来的开销。

const sumZero = n => {
  const ret = new Int16Array(n);
  for (let i = 1; i <= Math.floor(n / 2); ++i) {
    ret[i - 1] = i;
    ret[n - i] = -i;
  }
  return ret;
};

换个思路

咱们回看一下题目的限制条件,n 的取值范围是 [1,1000],所有加在一块儿求和是 500500,是一个安全的 int32 整数。因而一个方案孕育而生,咱们直接添加 n - 1 个连续的数字,而后把它们求和的负数放进去便可。

const sumZero = n => {
  const ret = new Int32Array(n);
  for (let i = 1; i < n; ++i) {
    ret[i] = i;
  }
  ret[0] = -((1 + n) * n / 2 - n);
  return ret;
};

再换个思路

咱们尝试写几组可能的解来看看:

n = 1, [0]
n = 2, [-1, 1]
n = 3, [-2, 0, 2]
n = 4, [-3, -1, 1, 3]
n = 5, [-4, -2, 0, 2, 4]

有没有以为这是一个很熟悉的数组,反正我是印象在大学 C++ 教材里有题目要求输出这个数组,哈哈哈哈。

对于这个数组,咱们尝试找一下规律应该就能发现,每一个数字实际上是符合这个公式的:

ret[i] = i * 2 - n + 1;

有了公式那么就直接写进代码便可。

const sumZero = n => {
  const ret = new Int16Array(n);
  for (let i = 0; i < n; ++i) {
    ret[i] = i * 2 - n + 1;
  }
  return ret;
};

总结

第 169 期周赛的第一题,想获得 Accepted 是很简单的。因此这里尝试给出了几种不一样的思路方向。固然我相信你们还会有更有意思的思路。>.<

相关连接

相关文章
相关标签/搜索