关于后端:月度刷题计划同款常规脑筋急转弯类构造题

36次阅读

共计 1479 个字符,预计需要花费 4 分钟才能阅读完成。

题目形容

这是 LeetCode 上的 667. 柔美的排列 II,难度为 中等

Tag :「结构」、「脑筋急转弯」

给你两个整数 nk,请你结构一个答案列表 answer,该列表该当蕴含从 1nn 个不同正整数,并同时满足下述条件:

假如该列表是 $answer = [a_1, a_2, a_3, … , a_n]$,那么列表 $[|a_1 – a_2|, |a_2 – a_3|, |a_3 – a_4|, … , |a_{n-1} – a_n|]$ 中应该有且仅有 k 个不同整数。

返回列表 answer。如果存在多种答案,只需返回其中 任意一种。

示例 1:

 输出:n = 3, k = 1

输入:[1, 2, 3]

解释:[1, 2, 3] 蕴含 3 个范畴在 1-3 的不同整数,并且 [1, 1] 中有且仅有 1 个不同整数:1

示例 2:

 输出:n = 3, k = 2

输入:[1, 3, 2]

解释:[1, 3, 2] 蕴含 3 个范畴在 1-3 的不同整数,并且 [2, 1] 中有且仅有 2 个不同整数:1 和 2

提醒:

  • $1 <= k < n <= 10^4$

结构

给定范畴在 $[1, n]$ 的 $n$ 个数,当「间接升序 / 降序」排列时,相邻项差值为 $1$,仅一种;而从首位开始依照「升序」距离排列,次位开始依照「降序」距离排列(即排列为 [1, n, 2, n - 1, 3, ...])时,相邻差值会从 $n – 1$ 开始递加至 $1$,共 $n – 1$ 种。

那么当咱们须要结构 $k$ 种序列时,咱们能够先通过「间接升序」的形式结构出若干个 $1$,而后再通过「距离位别离升降序」的形式结构出从 $k$ 到 $1$ 的差值,共 $k$ 个。

显然,咱们须要 $k + 1$ 个数来结构出 $k$ 个差值。因而咱们能够先从 $1$ 开始,应用 $n – (k + 1)$ 个数来间接升序(通过形式一结构出若干个 $1$),而后从 $n – k$ 开始距离升序排列,依照 $n$ 开始距离降序排列,结构出剩下的序列。

Java 代码:

class Solution {public int[] constructArray(int n, int k) {int[] ans = new int[n];
        int t = n - k - 1;
        for (int i = 0; i < t; i++) ans[i] = i + 1;
        for (int i = t, a = n - k, b = n; i < n;) {ans[i++] = a++;
            if (i < n) ans[i++] = b--;
        }
        return ans;
    }
}

TypeScript 代码:

function constructArray(n: number, k: number): number[] {const ans = new Array<number>(n).fill(0)
    const t = n - k - 1
    for (let i = 0; i < t; i++) ans[i] = i + 1
    for (let i = t, a = n - k, b = n; i < n;) {ans[i++] = a++
        if (i < n) ans[i++] = b--
    }
    return ans
};
  • 工夫复杂度:$O(n)$
  • 空间复杂度:$O(n)$

最初

这是咱们「刷穿 LeetCode」系列文章的第 No.667 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,局部是有锁题,咱们将先把所有不带锁的题目刷完。

在这个系列文章外面,除了解说解题思路以外,还会尽可能给出最为简洁的代码。如果波及通解还会相应的代码模板。

为了不便各位同学可能电脑上进行调试和提交代码,我建设了相干的仓库:https://github.com/SharingSource/LogicStack-LeetCode。

在仓库地址里,你能够看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其余优选题解。

更多更全更热门的「口试 / 面试」相干材料可拜访排版精美的 合集新基地 🎉🎉

正文完
 0