LeetCode 667 Beautiful Arrangement II

22 篇文章 0 订阅
15 篇文章 1 订阅

Given two integers n and k, you need to construct a list which contains n different positive integers ranging from 1 to n and obeys the following requirement: 
Suppose this list is [a1, a2, a3, ... , an], then the list [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] has exactly k distinct integers.

If there are multiple answers, print any of them.

Example 1:

Input: n = 3, k = 1
Output: [1, 2, 3]
Explanation: The [1, 2, 3] has three different positive integers ranging from 1 to 3, and the [1, 1] has exactly 1 distinct integer: 1.

Example 2:

Input: n = 3, k = 2
Output: [1, 3, 2]
Explanation: The [1, 3, 2] has three different positive integers ranging from 1 to 3, and the [2, 1] has exactly 2 distinct integers: 1 and 2.

Note:

  1. The n and k are in the range 1 <= k < n <= 104.
给两个数字n和k,要求你输出一个数组,数组符合如下要求:
长度为n,包含1到n的全部整数。数组中相邻两个数字之差的绝对值恰好有k种。

显然k的最大值只能是n-1.如果是n-1应该怎么排呢?n个数任取两个,两个数之差的绝对值有n-1种,只能让着n-1种全部出现。
举例,n=5 k=4.  绝对值有4种,即1-4,显然全部出现。
差的绝对值为4: 1和5,只有这一种情况,那么当前数组[1,5]
差的绝对值为3:[1,5,2]
差的绝对值为2:[1,5,2,4]
差的绝对值为1:   [1,5,2,4,3]
显然,每次取剩余数字中最大的或者最小的放进去,相当于初始化一个数组[1,2,3……n],然后从两边取值放到结果数组,最后剩下的中间的放到结果数组即可。
代码如下:
class Solution(object):
    def constructArray(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: List[int]
        """
        res = []
        max_num, min_num = n, 1
        for i in range(1, k+1):
            if i % 2 == 0:
                res.append(max_num)
                max_num -= 1
            else:
                res.append(min_num)
                min_num += 1
        if k % 2 == 0:
            for i in range(max_num,min_num-1,-1):
                res.append(i)
        else:
            for i in range(min_num,max_num+1,1):
                res.append(i)
        return res


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值