leetcode随机一题667优美的排列

leetcode随机一题667优美的排列

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

假设该列表是 answer = [a1, a2, a3, … , an] ,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数。
返回列表 answer 。如果存在多种答案,只需返回其中 任意一种 。

题意很清楚,给了1到n,n个数,返回一种符合相邻元素绝对值差只有k种的序列,考虑k的范围是1到n-1,k=1就是按升序或者降序排列,1,2,3…n,相邻的差都是1,那么k就是1,k最大是n-1,因为最大的差值也不过是n和1的差值,那么k表示的差值的种类从1到n-1就是n-1种,考虑什么时候能取到n-1的差值,那就是n和1相邻的时候,n-2的差值就是n和2相邻的时候,或者n-1和1相邻的时候,那么就有一种简单的构造的思路来做这道题,在顺序排列的基础上,根据要求的k对应的从后面取出大值,放到前面来,形成新的差值,每个大值能形成最多两个新的差值,比如把n放到前面来和1和2做差,得到新的差值n-1,n-2,也可以插到1的前面,只和1做差,形成新的一个差值n-1,这取决于k的奇偶性,k是奇数是,就从1的前面插入,让n只形成n-1一个新的差值,k是偶数时,从1的后面插入,形成n-1,n-2两个差值,接着n-1从2的后面插入,可以形成,n-3,n-4两个新的差值。

class Solution {
public:
    vector<int> constructArray(int n, int k) {
        int cnt=k/2;
        vector<int>ans;
        for(int i=1;i<=n-cnt;i++)ans.push_back(i);
        int bias=(k&1)?1:0;

        for(int i=n;i>=n-cnt+1;i--)
        {
            ans.insert(ans.begin()+bias+2*(n-i),i );
        }
        return ans;

          

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值