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;
    }
  }
};

猜你喜欢

转载自www.cnblogs.com/ethanhong/p/10174436.html