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

这道题定义了一种漂亮数组,说的是在任意两个数字之间,不存在一个正好是这两个数之和的一半的数字,现在让返回长度是N的一个漂亮数组,注意这里长度是N的漂亮数组一定是由1到N之间的数字组成的,每个数字都会出现,而且一定存在这样的漂亮数组。博主刚开始时是没什么头绪的,想着总不会是要遍历所有的排列情况,然后对每个情况去验证是否是漂亮数组的吧,想想都觉得很不高效,于是就放弃挣扎,直接逛论坛了。不出意外,最高票的还是你李哥,居然提出了逆天的线性时间的解法,献上膝盖,怪不得有网友直接要 Venmo 号立马打钱,LOL~ 这道题给了提示说是要用分治法来做,但是怎么分是这道题的精髓,若只是普通的对半分,那么在 merge 的时候还是要验证是否是漂亮数组,麻烦!但若按奇偶来分的话,那就非常的叼了,因为奇数加偶数等于奇数,就不会是任何一个数字的2倍了。这就是奇偶分堆的好处,这时任意两个数字肯定不能分别从奇偶堆里取了,那可能你会问,奇数堆会不会有三个奇数打破这个规则呢?只要这个奇数堆是从一个漂亮数组按固定的规则变化而来的,就能保证一定也是漂亮数组,因为对于任意一个漂亮数组,若对每个数字都加上一个相同的数字,或者都乘上一个相同的数字,则一定还是漂亮数组,因为数字的之间的内在关系并没有改变。明白了上面这些,基本就可以解题了,假设此时已经有了一个长度为n的漂亮数组,如何将其扩大呢?可以将其中每个数字都乘以2并加1,就都会变成奇数,并且这个奇数数组还是漂亮的,然后再将每个数字都乘以2,那么都会变成偶数,并且这个偶数数组还是漂亮的,两个数组拼接起来,就会得到一个长度为 2n 的漂亮数组。就是这种思路,可以从1开始,1本身就是一个漂亮数组,然后将其扩大,注意这里要卡一个N,不能让扩大的数组长度超过N,只要在变为奇数和偶数时加个判定就行了,将不大于N的数组加入到新的数组中,参见代码如下:

class Solution {
public:
vector<int> beautifulArray(int N) {
vector<int> res{1};
while (res.size() < N) {
vector<int> t;
for (int num : res) {
if (num * 2 - 1 <= N) t.push_back(num * 2 - 1);
}
for (int num : res) {
if (num * 2 <= N) t.push_back(num * 2);
}
res = t;
}
return res;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/932

参考资料:

https://leetcode.com/problems/beautiful-array/

https://leetcode.com/problems/beautiful-array/discuss/186679/Odd-%2B-Even-Pattern-O(N)

https://leetcode.com/problems/beautiful-array/discuss/187669/Share-my-O(NlogN)-C%2B%2B-solution-with-proof-and-explanation

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

最新文章

  1. PopupWindow的使用
  2. codeforces Good Bye 2015 B. New Year and Old Property
  3. Python 部署项目(Tomcat 容器)
  4. highcharts 设置标题不显示
  5. 从html5标准的正式发布到国内CMS的变革
  6. hdu5126stars
  7. ajax全局函数运用
  8. 64位win8 配置Apache2.4+mod_msgi4.4.21+django1.8.6+python3.4
  9. linux_创建用户_copy远程文件_解压缩_执行
  10. Python-杂物
  11. Centos7上安装、破解bamboo6.0.3
  12. html文件上传保存-(.html and string translate into .html )
  13. 朱晔和你聊Spring系列S1E2:SpringBoot并不神秘
  14. python学习笔记(1)--python特点
  15. 处理Task引发的异常
  16. CodeChef - CRYPCUR
  17. centos6.5环境下zookeeper-3.4.6集群环境部署及单机部署详解
  18. 小睿开始呼叫用户,然后FS怎么跟用户交互的整个流程原理
  19. 【Qt】QOpenGLWidget展示蒙版效果
  20. 《Unix&amp;Linux大学教程》学习笔记二:指令常识

热门文章

  1. 算法设计与分析 - AC 代码 - 第 6 弹(重复第 3 弹)
  2. 自定义Model类
  3. 在centos7中安装MySQL5.7
  4. pip使用镜像的方法
  5. Leet Code 8.字符串转换整数
  6. MariaDB——日志文件
  7. Day3-L-Cup HDU2289
  8. 大数据萌新的Python学习之路(二)
  9. IOS 3种内省方法
  10. switch不能case字符串