漂亮数组 Beautiful Array

2019-04-06 16:09:56

问题描述:

问题求解:

本题还是挺有难度的,主要是要考虑好如何去进行构造。

首先考虑到2 * A[i] = A[j] + A[k],那么j,k就必须是同奇同偶,否则它们的和必为奇数,显然等式不成立。

那么如果我们将N的数组分成两个部分,一部分全奇数,一部分全偶数,并且这两个部分是Beautiful Array,那么将它们concat一下,得到的也是Beautiful Array。

那么如何得到这两个部分呢?

这就需要一些数学的证明了,很容易证明得到漂亮数组满足以下的两个性质。

  • 同乘一个数依然是漂亮数组
  • 同加一个数依然是漂亮数组

得到这两个性质后就可以进行构造了,从{1}开始,每次得到{A * 2 - 1}和{A * 2},显然这两个数组是漂亮数组,并且分别是奇数和偶数数组,将它们concat之后就会得到长度更长的数组,这样就可以构造出来结果需要的数组。

    public int[] beautifulArray(int N) {
        List<Integer> res = new ArrayList<>();
        res.add(1);
        while (res.size() < N) {
            List<Integer> tmp = new ArrayList<>();
            for (int i : res) if (i * 2 - 1 <= N) tmp.add(i * 2 - 1);
            for (int i : res) if (i * 2 <= N) tmp.add(i * 2);
            res = tmp;
        }
        return res.stream().mapToInt(i -> i).toArray();
    }

  

原文地址:https://www.cnblogs.com/TIMHY/p/10662077.html

时间: 2024-10-19 09:06:40

漂亮数组 Beautiful Array的相关文章

[Swift Weekly Contest 108]LeetCode932. 漂亮数组 | 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 th

漂亮数组解法

漂亮数组:给定一个长度为N的数组arr,该数组由1到N的整数来组成,且满足arr[k]*2不等于arr[i]+arr[j]  (i<k<j) 例如: 长度为4的数组:{2,1,4,3} 长度为8的数组:[1,5,3,7,2,6,4,8] 假设一个数组为漂亮数组,则该数组一定满足下列条件: (1)数组中的每一个数加上一个任意整数,依旧维持漂亮数组. 例如:将{2,1,4,3}全部加一 得到  {3,2,5,4}  依旧满足 (2)将数组中的每一个数都乘上一个非0整数,依旧满足 例如:将{2,1,

OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间使用.OpenGL3.0已经废弃此方法.每个glVertex与GPU进行一次通信,十分低效. glBegin(GL_TRIANGLES); glVertex(0, 0); glVertex(1, 1); glVertex(2, 2); glEnd(); 2.显示列表(glCallList) 每个gl

Swift入门(五)——数组(Array)

集合 集合的定义 Swift中提供了两种数据结构用于存放数据的集合,分别是数组(Array)和字典(Dictionary).他们的主要区别在于数组中的元素由下标确定,而字典中的数据的值由数据的键(Key)决定.以下我们认为集合就是数组或字典. 集合的可变性 我们可以定义一个集合常量或者集合变量.一旦定义为常量,就意味着集合的长度.内容和顺序都不能再修改了.比如,定义为常量的数组,不能再向其中添加新的元素. 数组的创建 由于swift中变量的创建遵循" var 变量名:变量类型 "的语法

javascript中的稀疏数组(sparse array)和密集数组

学习underscore.js数组相关API的时候,遇到了sparse array这个东西,以前没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连续的存储空间,有着固定的长度.加入数组其实位置是address,长度为n,那么占用的存储空间是address[0],address[1],address[2].......address[n-1].即数组元素之间是紧密相连的,不存在空隙.如下的js代码创建的就是一个密集数组 var data = [

.net框架-数组(Array)&amp; ArrayList &amp; List

数组(Array)特点: 初始化时规定长度 元素类型相同 数据存储连续,效率高 System.Collections.ArrayList : 初始化时无需规定长度,长度随存储的数据动态扩充与收缩 元素类型可以不相同,其内部使用object[]实现数据存储,因此会数据读写时会频敏装箱.拆箱从而影响效率 继承接口:IList.ICollection.IEnumerable.ICloneable,数据增.删.改查十分方便 System.Collections.Generic.List<T>: 范型类

JS数组(Array)操作汇总

1.去掉重复的数组元素.2.获取一个数组中的重复项.3.求一个字符串的字节长度,一个英文字符占用一个字节,一个中文字符占用两个字节.4.判断一个字符串中出现次数最多的字符,统计这个次数.5.数组排序. 6.快排. 7.删除/添加数组项. 8.数组随机顺序输出. 9.数组求和.最大值. 10.判断是否为数组. 11.冒泡排序. 1.去掉重复的数组元素. Array.prototype.unique = function() { var ret = []; var o = {}; for(var i

后缀数组(suffix array)

参考: Suffix array - Wiki 后缀数组(suffix array)详解 6.3   Suffix Arrays - 算法红宝书 Suffix Array 后缀数组 基本概念 应用:字符串处理.生物信息序列处理 后缀:学过英语的都知道什么叫后缀,就是从某个位置开始到字符串结尾的特殊子串,记住 Suffix(i)=S[i...len(S)-1],i就是后缀起始位置 后缀数组:就是将后缀排序好后放到一个一维数组里,SA[i]存放排名第i大的后缀首字符下标,并且保证 Suffix(SA

PHP中的数组(Array)

定义数组的方式: 使用array内置关键字 使用[]定义 直接赋值 <?phpecho '<pre>'; //定义数组的方式////1.使用array内置关键字$arr = array(1,2,4);print_r($arr); //2.使用[]定义$brr = [1,2,4];print_r($brr); //3.直接赋值$crr[] = 1;$crr[] = 2;$crr[] = 4; print_r($crr); $drr[1] = 1;$drr[2] = 2;$drr[3] =