漂亮数组解法

漂亮数组:给定一个长度为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,4,3}都乘2

得到{4,2,8,6}

(3)最重要的一条来了,将一个全是奇数的漂亮数组和一个全是偶数的漂亮数组合并在一起,依旧是一个漂亮数组。

例如:将{2,1,4,3}都乘2

得到偶数漂亮数组{4,2,8,6}

再将这个偶数数组全部-1,得到奇数数组{3,1,7,5}

将这两个数组合并,得到{3,1,7,5,4,2,8,6}依然满足规则。

所以可以通过这个规则,获得长度为4,8,16,32....的漂亮数组

(4)最后一个规则,就是漂亮数组中删去一个数,依旧能保持漂亮数组

代码如下:

class Solution {

public int[] beautifulArray(int N) {

int array[] = new int[2000];

int array2[] = new int[N];

int k  =0;

array[0] = 2;

array[1] = 1;

array[2] = 4;

array[3] = 3;

for(int i = 1;i<200;i*=2){

for(int j = 0;j<i*4;j++){

array[i*4+j] = array[j]*2;

array[j] = array[j]*2-1;

}

}

for(int i = 0;i<2000;i++){

if(k<N&&array[i]!=0&&array[i]<=N){

array2[k] = array[i];

k++;

}

}

return array2;

}

}

原文地址:https://www.cnblogs.com/yyywh/p/11619817.html

时间: 2024-09-30 15:51:59

漂亮数组解法的相关文章

HDU 1754 树状数组 解法

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

hdu1394 树状数组 解法

本题使用树状数组果然更加快. 树状数组难点: 1 如何遍历树 2 如何利用数组数据 建立一个树状数组就如上图红色部分代表所有的树状数组节点了. 基本操作: 查找下一个节点的计算,如不明白下面函数的作用,请查看负数内存存放的问题. 简而言之就是:内存放是求反+1: 利用这个函数可以神奇地寻找到其单亲节点和兄弟节点,比如上图6->8,6->4或者7->8, 7 -> 6这样跳转节点. 这是树状数组实现的关键了,理解了如何遍历这样的树,就会使用这个数据结构了. inline int lo

Poj 2299 Ultra-QuickSort 树状数组 解法

本题的树状数组稍微有点特点,就是需要所谓的离散化一下,开始听这个名称好像很神秘的,不过其实很简单. 就是把一个数组arr的值,其中的值是不连续的,变成一组连续的值,因为这样他们的顺序是不变的,所以,不影响结果. 例如:9 1 0 5 4 ->变为:5 2 1 4 3看出他们的相对位置不变的. 9和5为最大值在第一个位置,1和2为第二大的值在第二个位置,0和1在第一个位置等,看出对应顺序了吗? 对,就是这么简单的方法, 就叫做离散化. 如果你对counting sort熟悉的话,那么这样的思想理解

小朋友学数据结构(1):约瑟夫环的链表解法、数组解法和数学公式解法

约瑟夫环的链表解法.数组解法和数学公式解法 约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义.约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难.在那里,这些叛乱者表决说"要投降毋宁死".于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的.约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品

[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

漂亮数组 Beautiful Array

2019-04-06 16:09:56 问题描述: 问题求解: 本题还是挺有难度的,主要是要考虑好如何去进行构造. 首先考虑到2 * A[i] = A[j] + A[k],那么j,k就必须是同奇同偶,否则它们的和必为奇数,显然等式不成立. 那么如果我们将N的数组分成两个部分,一部分全奇数,一部分全偶数,并且这两个部分是Beautiful Array,那么将它们concat一下,得到的也是Beautiful Array. 那么如何得到这两个部分呢? 这就需要一些数学的证明了,很容易证明得到漂亮数组

leetcode——932.漂亮数组/

漂亮数组: 对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得: 对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]. 那么数组 A 是漂亮数组. 给定 N,返回任意漂亮数组 A(保证存在一个). 输入:4 输出:[2,1,4,3] 这个如何用分治算法呢? 分析 首先我们可以发现一个不错的性质,如果某个数组 是漂亮的,那么对这个数组进行仿射变换,得到的新数组 也是漂亮的.那么我们就有了一个想法

N个数循环奇数位数的数组解法

原题是这样的:有N个数组成的数组,要求去除奇数位置上的数字,分别打印出这些数字:剩下的数字从新排列,继续去除其中技术位置上的数字,并打印这些数字:以此类推,直到只剩下最后一个数字,要求在屏幕上打印这些数字,并且显示最后剩下的一个数字在原来数组中的位置. 其实这是很有规律的,用数学方法解很方便.想法是第一次去除的是:{1,3,5,7….}全部的奇数,第二次去除的是{1,3,5,7,9…}×2,第三次去除的是{1,3,5,7,9}×2^2以此类推,很容易根据数学规律写出程式出来. 不巧的是下午头脑发

uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1

Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General of Nlogonia's Army decided to attack the enemy with a linear formation of soldiers, that would advance together until conquering the neighboring count