寶寶也能看懂的 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 是很簡單的。因此這裏嘗試給出了幾種不一樣的思路方向。固然我相信你們還會有更有意思的思路。>.<

相關連接

相關文章
相關標籤/搜索