LeetCode每日一题——667. 优美的排列 II

简介: 给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:

题目

给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:

假设该列表是 answer = [a1, a2, a3, … , an] ,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 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 <= 104

思路

找规律的题:

当n = 50, k = 20时:

[1,21,2,20,3,19,4,18,5,17,6,16,7,15,8,14,9,13,10,12,11,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]

当n = 50,k = 17时:

[1,18,2,17,3,16,4,15,5,14,6,13,7,12,8,11,9,10,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]

当n = 80,k = 30时:

[1,31,2,30,3,29,4,28,5,27,6,26,7,25,8,24,9,23,10,22,11,21,12,20,13,19,14,18,15,17,16,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80]

是不是发现了规律,就是下标从[0, k]中,偶数下标填充[1,2,3…],奇数下标填充[k + 1, k, k - 1…],后面[k + 1, n - 1]都是顺序填充

接下来只需要编码实现即可

题解

class Solution:
    def constructArray(self, n: int, k: int) -> List[int]:
      # 生成1-n的列表
        tmp = list(range(1, n+1))
        # 奇、偶坐标的初始值
        l,r = 1, k+1
        # 遍历下标0-k+1的数
        for i in range(k+1):
          # 下标为偶数
            if i % 2 == 0:
                tmp[i] = l
                l += 1
            # 下标为奇数
            else:
                tmp[i] = r
                r -= 1
        return tmp
目录
相关文章
|
7月前
|
测试技术
leetcode-1592:重新排列单词间的空格
leetcode-1592:重新排列单词间的空格
48 0
|
2月前
|
算法 C++ 容器
Leetcode第三十一题(下一个排列)
这篇文章介绍了LeetCode第31题“下一个排列”的C++解决方案,该算法通过原地修改数组来找到下一个字典序更大的排列,如果不存在则重排为字典序最小的排列。
33 0
Leetcode第三十一题(下一个排列)
|
6月前
|
存储 算法 数据挖掘
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
56 0
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
|
6月前
|
存储 算法 数据挖掘
LeetCode 题目 31:下一个排列【python】
LeetCode 题目 31:下一个排列【python】
|
7月前
|
容器
leetcode-31:下一个排列
leetcode-31:下一个排列
53 1
|
7月前
|
Go
golang力扣leetcode 937.重新排列日志文件
golang力扣leetcode 937.重新排列日志文件
53 0
|
7月前
|
Go
golang力扣leetcode 31.下一个排列
golang力扣leetcode 31.下一个排列
43 0