|
| 1 | +package com.leetcode_cn.medium; |
| 2 | + |
| 3 | +import java.util.Arrays; |
| 4 | + |
| 5 | +/***************漂亮数组*************/ |
| 6 | +/** |
| 7 | + * 对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得: |
| 8 | + * |
| 9 | + * 对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。 |
| 10 | + * |
| 11 | + * 那么数组 A 是漂亮数组。 |
| 12 | + * |
| 13 | + * 给定 N,返回任意漂亮数组 A(保证存在一个)。 |
| 14 | + * |
| 15 | + * 示例 1: |
| 16 | + * |
| 17 | + * 输入:4 |
| 18 | + * |
| 19 | + * 输出:[2,1,4,3] |
| 20 | + * |
| 21 | + * 示例 2: |
| 22 | + * |
| 23 | + * 输入:5 |
| 24 | + * |
| 25 | + * 输出:[3,1,2,5,4] |
| 26 | + * |
| 27 | + * 提示: |
| 28 | + * |
| 29 | + * 1 <= N <= 1000 |
| 30 | + * |
| 31 | + * @author ffj |
| 32 | + * |
| 33 | + */ |
| 34 | +public class BeautifulArray { |
| 35 | + |
| 36 | + public static void main(String[] args) { |
| 37 | + int N = 5; |
| 38 | + int[] result = new BeautifulArray().beautifulArray(N); |
| 39 | + System.out.println(Arrays.toString(result)); |
| 40 | + } |
| 41 | + |
| 42 | + /** |
| 43 | + * 漂亮数组有以下的性质: |
| 44 | + * |
| 45 | + * (1)A是一个漂亮数组,如果对A中所有元素添加一个常数,那么A还是一个漂亮数组。 |
| 46 | + * |
| 47 | + * (2)A是一个漂亮数组,如果对A中所有元素乘以一个常数,那么A还是一个漂亮数组。 |
| 48 | + * |
| 49 | + * (3)A是一个漂亮数组,如果删除一些A中所有元素,那么A还是一个漂亮数组。 |
| 50 | + * |
| 51 | + * (4) A是一个奇数构成的漂亮数组,B是一个偶数构成的漂亮数组,那么A+B也是一个漂亮数组 |
| 52 | + * 比如:{1,5,3,7}+{2,6,4,8}={1,5,3,7,2,6,4,8}也是一个漂亮数组。 |
| 53 | + * |
| 54 | + * 所以我们假设一个{1-m}的数组是漂亮数组,可以通过下面的方式构造漂亮数组{1-2m}: |
| 55 | + * |
| 56 | + * 1.对{1-m}中所有的数乘以2-1,构成一个奇数漂亮数组A。如{1,3,2,4},可以得到{1,5,3,7} |
| 57 | + * 2.对{1-m}中所有的数乘以2,构成一个偶数漂亮数组B,如{1,3,2,4}, 可以得到{2,6,4,8} |
| 58 | + * 3.A+B构成了{1-2m}的漂亮数组。{1,5,3,7}+{2,6,4,8}={1,5,3,7,2,6,4,8} |
| 59 | + * |
| 60 | + * 4.从中删除不要的数字即可。 |
| 61 | + * |
| 62 | + * |
| 63 | + * @param N |
| 64 | + * @return |
| 65 | + */ |
| 66 | + public int[] beautifulArray(int N) { |
| 67 | + int[] nums = new int[N]; |
| 68 | + nums[0] = 1; |
| 69 | + if (N == 1) |
| 70 | + return nums; |
| 71 | + int m = N - 1; |
| 72 | + int k = 1; |
| 73 | + while (m != 1) { |
| 74 | + m >>= 1; |
| 75 | + k <<= 1; |
| 76 | + } |
| 77 | + int i = 1, t = 1, j; |
| 78 | + while (i < N) { |
| 79 | + for (j = 0; j < t; j++) { |
| 80 | + if (nums[j] + k <= N) { |
| 81 | + nums[i] = nums[j] + k; |
| 82 | + i++; |
| 83 | + } |
| 84 | + } |
| 85 | + t = i; |
| 86 | + k >>= 1; |
| 87 | + } |
| 88 | + return nums; |
| 89 | + } |
| 90 | + |
| 91 | +} |
0 commit comments