LeetCode题目——667. 优美的排列 II
作者:互联网
题目如下:
给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:
① 如果这个数组是 [a1, a2, a3, ... , an] ,那么数组 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] 中应该有且仅有 k 个不同整数;.
② 如果存在多种答案,你只需实现并返回其中任意一种.
示例 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
方法一:
从第i个点开始,循环k次,每次逆转i到n的元素,然后i+1。这样的话,每逆转一次,会产生一个不同的差值。代码如下:
class Solution:
def constructArray(self, n: int, k: int) -> List[int]:
res = list(range(1, n + 1))
for i in range(1, k):
res[i:] = res[:i-1:-1]
return res
方法二:
对前k个元素操作(奇数位从1开始往里面填数,1递增,偶数位从n开始往里面填数,n递减),剩余元素按顺序从小到大向后排列即可。代码如下:
class Solution:
def constructArray(self, n: int, k: int) -> List[int]:
arr, s, e, i = [], 1, n, 0
while(s <= e):
if((i < k and i % 2 == 0) or (i >= k and (k - 1) % 2 == 0)):
arr.append(s)
s += 1
else:
arr.append(e)
e -= 1
i += 1
return arr
标签:arr,667,res,整数,II,int,a3,a2,LeetCode 来源: https://blog.csdn.net/Mr_LiShao/article/details/100583840