• 【Leetcode】667. 优美的排列 II


    667. 优美的排列 II

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

    • 假设该列表是 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
    
    • 1
    • 2
    • 3

    示例 2:

    输入:n = 3, k = 2
    输出:[1, 3, 2]
    解释:[1, 3, 2] 包含 3 个范围在 1-3 的不同整数,并且 [2, 1] 中有且仅有 2 个不同整数:12
    
    • 1
    • 2
    • 3

    提示:

    • 1 <= k < n <= 104

    解题思路

    本题的题意还是比较容易理解的,我们需要构建一个这样的序列,保证所构成的序列中相邻元素的差的绝对值只有k种选择。这题是个数学题,需要找到合适方法来构建序列。

    那么如何来构建呢?

    1. 首先分析情况,这k种差值如何来选择,是1到k还是胡乱的都行,对于这一题,由于所给的序列是1到n的有序序列,所以构建差值为1到k的更简单
    2. 如何来构建包含1到k的所有差值的序列呢?因为是1到n的所有选择,所以可以根据1, 2,3…来构建,构建方式为1, k + 1, 2, k , 3,…

    一直构建到差值的绝对值为1就停止,一共k+ 1个数,剩下的数就按照升序全部排列到后面,就可以保证序列中相邻元素的差值都是1到k。但是会有一个小问题需要简单证明一下。

    在构建的过程中,可以发现构建出来的序列就是1到k + 1组成,但是最后一位并不确定,而后面加入的升序序列就是k + 2到n。现在知道的是后面序列的第一位是k+ 2, 但是前面序列的最后一位并不知道,他们两个的差值的绝对值会不会超过k呢?

    1. k为偶数
    2. k为奇数

    证明发现,前后两个序列的两个数值差是一定小于等于k的,所以这种构建方法是合理的。


    代码实现
    class Solution
    {
    public:
        vector<int> constructArray(int n, int k)
        {
            vector<int> res(n, 0);
            //构建前面一个序列
            // 1. 将1,2,3,4...放入数组
            for (int i = 0, num = 1; i <= k; i += 2, num++)
                res[i] = num;
            // 2. 将k+1, k, k-1, k-2...放入数组
            for (int i = 1, num = k + 1; i <= k; i += 2, num--)
                res[i] = num;
            
            //插入后面序列
            // 3. 处理尾部数据,升序排列放入数组后面
            for (int i = k + 1, num = k + 2; i < n; i++, num++)
                res[i] = num;
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    Spring Security 介绍中的 servlet 和 reactive
    hive表加载csv格式数据或者json格式数据
    【Android】修改Apk中资源文件
    【TES720D-KIT】青翼自研基于复旦微FMQL20S400全国产化ARM开发套件(核心板+底板)
    Go字符串拼接6种方式及其性能测试:strings.builder最快
    【系统分析师之路】第十二章 复盘计算机原理与组成结构(嵌入式设计)
    设计模式-原型模式
    请求工具类和base64转成MultipartFile工具类
    经典组件大更新,微软为Windows 11重新设计记事本
    SpringMVC的文件上传与下载
  • 原文地址:https://blog.csdn.net/qq_52906742/article/details/126769282