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