• LC 932. Beautiful Array


    For some fixed N, an array A is beautiful if it is a permutation of the integers 1, 2, ..., N, such that:

    For every i < j, there is no k with i < k < j such that A[k] * 2 = A[i] + A[j].

    Given N, return any beautiful array A.  (It is guaranteed that one exists.)

     

    Example 1:

    Input: 4
    Output: [2,1,4,3]
    

    Example 2:

    Input: 5
    Output: [3,1,2,5,4]

     

    Note:

    • 1 <= N <= 1000
     
     

    一道很好的构造题。自己没有想出来,看了晚上的解答,但是感觉大家写的都差不多,但没有说到点子上。

    1. 首先,基本的想法是让所有的奇数放在一边,让所有的偶数放在另一边,这样能确保当以中间的数为K时,左右两边不会加起来有偶数出现。

    2. 再考虑两边的情况,这个时候就不能用奇数和偶数的性质了,因为在这里所有的数要么都是奇数,要么都是偶数。

    这个时候,需要这样考虑,奇数也是有顺序的,比如说,1,3,5,7,9 这样的奇数序列就是递增的,1是第1个奇数,3是第2个奇数,5是第3个

    奇数等。如果我们不是对奇数进行排列了,而是对奇数的顺序进行再递归调用刚才的思想,是否能得到正确的解答呢?

    这就要考虑一个问题,假设存在2k != x + y,那第k个奇数,第x个奇数,第y个奇数是否也有这样的性质?第k个偶数,第x个偶数,第y个偶数是否也有这样的性质?

    很简单,2(2*k-1) - (2*x-1) - (2*y-1) = 4*k - 2*x - 2*y = 2(2*k - x - y) != 0,因此这个式子是成立的。对偶数也是相同的情况。

    所以,我们有这样一个递归的解法。

    Accepted

    Runtime: 8 ms, faster than 70.97% of C++ online submissions for Beautiful Array.

    class Solution {
    public:
      vector<int> beautifulArray(int N) {
        if(N == 1) return {1};
        else{
          vector<int> ret;
          int oddnum = (N+1)/2;
          vector<int> oddpart = beautifulArray(oddnum);
          for(auto x : oddpart) ret.push_back(x*2-1);
          int evennum = (N)/2;
          vector<int> evenpart = beautifulArray(evennum);
          for(auto x : evenpart) ret.push_back(x*2);
          return ret;
        }
      }
    };
  • 相关阅读:
    如何判断点击是否在区域内
    WCF SSL(应用篇-Message)-02
    WCF SSL(证书篇)-01
    获取浏览客户的地址信息
    ASP.Net Controls 用法大全
    C#实现倒油算法
    C#操作Excel(读取)
    C#提取字符串中的数字字符串
    对比MFC和Winform及WPF
    C#图片水印代码整理
  • 原文地址:https://www.cnblogs.com/ethanhong/p/10174436.html
Copyright © 2020-2023  润新知