LeetCode - 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
这道题是用divide and conque 做的。参考自: https://blog.csdn.net/lwgkzl/article/details/83502656
因为2*A[k]是偶数,如果要求2*A[K]!=A[I]+A[J]那么可以构造位置在A[k]左边的全部放奇数,位置在A[k]右边的全部放偶数。这样就保证了对于K位置而言,这个性质是满足的。
也许你就有疑问了,1,3,5,6,2,4.这组序列中,虽然对于6位置而言,左边全是奇数,右边全是偶数,但是全是奇数的那一边明显不满足要求。怎么解决呢?
习惯从幼儿园开始就要养成,左边是奇数,右边是偶数的形式也得从N比较小的时候开始。这里有一个递归的思想。因为长度为N的序列中,奇数个数为(N+1)/2,偶数个数为N/2,所以Beautiful Array(N)的排列,可以由Beautiful Array(N/2)和Beautiful Array((N+1)/2)组成,为什么这么说呢?
假设N = 7,那么Beautiful Array(N/2) = 1,,3,2(满足题目性质) Beautiful Array((N+1)/2) = 1 3 2 4.(满足题目性质)
那么 2*Beautiful Array((N+1)/2)-1(奇数在前)连接 2*Beautiful Array(N/2) = 1 5 3 7 | 2 6 4.(逐个元素进行操作)
我们可以观察到,对于这个分隔符而言,左边是奇数,右边是偶数,所以在分隔符位置,无疑是满足题目要求的性质的。而且,左边的奇数是从满足题目性质的数组进行线性运算得出的,所以并不会影响各个位置数字间的性质,(如1,3,5. 2*3==1+5,同时乘2之后这个性质依然成立)。既然组成这个大数组的子数组Beautiful Array(N/2)和Beautiful Array((N+1)/2)都满足性质,那么乘法之后的数组也依然满足题目要求。所以大数组左半部分和右半部分都满足题目要求。而中间分隔位置也满足性质,所以这一整个大数组也满足题目性质了。所以我们只需要保证Beautiful Array(1)满足题目性质就可以递推出所有的Beautiful Array(N)了。很明显Beautiful Array(1)没有别的选择,只能满足性质。
class Solution {
    public int[] beautifulArray(int N) {
        int[] res = new int[N];
        if(N == 1){
            res[0] = 1;
            return res;
        }
        else{
            int[] arr1 = beautifulArray ((N+1)/2);
            for(int i = 0; i<arr1.length; i++){
                res[i] = 2*arr1[i] - 1;
            }
            int[] arr2 = beautifulArray(N/2);
            for(int i= arr1.length; i<arr1.length+arr2.length; i++){
                res[i] = 2*arr2[i -  arr1.length];
            }
        }
        return res;
    }
}
LeetCode - Beautiful Array的更多相关文章
- [LeetCode] 932. Beautiful Array 漂亮数组
		
For some fixed N, an array A is beautiful if it is a permutation of the integers 1, 2, ..., N, such ...
 - 【LeetCode】932. Beautiful Array 解题报告(Python)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 构造法 递归 相似题目 参考资料 日期 题目地址:h ...
 - [Swift]LeetCode932. 漂亮数组 | Beautiful Array
		
For some fixed N, an array A is beautiful if it is a permutation of the integers 1, 2, ..., N, such ...
 - 932. Beautiful Array
		
For some fixed N, an array A is beautiful if it is a permutation of the integers 1, 2, ..., N, such ...
 - C++ STL@ list 应用 (leetcode: Rotate Array)
		
STL中的list就是一双向链表,可高效地进行插入删除元素. List 是 C++标准程式库 中的一个 类 ,可以简单视之为双向 连结串行 ,以线性列的方式管理物件集合.list 的特色是在集合的任何 ...
 - 漂亮数组 Beautiful Array
		
2019-04-06 16:09:56 问题描述: 问题求解: 本题还是挺有难度的,主要是要考虑好如何去进行构造. 首先考虑到2 * A[i] = A[j] + A[k],那么j,k就必须是同奇同偶, ...
 - Educational Codeforces Round 63 D. Beautiful Array
		
D. Beautiful Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
 - 北邮校赛 I. Beautiful Array(DP)
		
I. Beautiful Array 2017- BUPT Collegiate Programming Contest - sync 时间限制 1000 ms 内存限制 65536 KB 题目描述 ...
 - [Educational Codeforces Round 63 ] D. Beautiful Array (思维+DP)
		
Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array time limit per test 2 seconds ...
 
随机推荐
- datetime.strptime格式转换报错ValueError
			
今天遇到一个报错:ValueError: time data '2018-10-10(Wednesday) AM0:50' does not match format '%Y-%m-%d(%A) %p ...
 - OOP⑻
			
1.接口: 类 和 对象 对象 is a 类 例子: 小鸟 is a 动物 飞机 is a 交通工具 子弹 is a 武器 卫星 is a 通讯工具 问题? 01. 小鸟 飞机 子弹 卫星 虽然不是一 ...
 - java中构造方法和方法全面解析
			
构造方法和方法的区别: 构造方法要与类名相同,无返回类型,在类初始化的时候调用. 方法最好与类名不同,对象调用,静态方法可用类名.方法(). 构造器和方法在下面三个方面区别:修饰符,返回值, ...
 - javascript进阶笔记(1)
			
学习js已经有一段时间了,大大小小还是能够做出一些东西来.不过觉得可惜的是,还是对js本身这门语言不是很熟悉,总有一点雾里看花的感觉,看得见,但是看不清楚.最近发现有一本关于js的叫做<忍者秘籍 ...
 - 如何在Ubuntu中安装中文输入法
			
在使用ubuntu系统时,有的时候总觉得英文输入法不方便操作,总希望能有中文输入法可以辅助操作,那怎样才能在ubuntu中安装中文输入法呢?下面有一种简单的方法可以安装中文输入法. 如何在ubuntu ...
 - 在嵌入式设计中使用MicroBlaze(Vivado版本)(转)
			
原文Xilinx官方文档<ug898-vivado-embedded-design>第三章 一.MicroBlaze处理器设计介绍(略) 二.创建带有MicroBlaze处理器的IP设计 ...
 - Java与C++简单对比
			
Java语言让编程者无法找到指针来直接访问内存,并且增添了自动的内存管理功能,从而有效的组织了C/C++语言中指针操作失误,如滥用指针所造成的系统崩溃,Java的指针在虚拟机内部使用,这保证了Java ...
 - W phase 学习
			
W phase 的组成:(相关文献发现W phase适用于6级以上的地震) P, PP,S,SS,SP,PS等等长周期的震相: 它的传播机制和whispering gallery 相似. 从简振理论来 ...
 - float浮动,定位
			
1 浮动定位 1.普通流定位 普通流,由称为文档流 块级元素:从上到下一个一个的排列 行内元素:一行内从左到右的排列 2.浮动定位 ...
 - 【webdriver自动化】使用unittest实现自动登录163邮箱然后新建一个联系人
			
#练习:登录163邮箱然后新建一个联系人 import unittest import time from selenium import webdriver from selenium.webdri ...