leetcode932.BeautifulArray

N0.932. Beautiful Array
题意:给定一个排列,要求给出其满足对于任意一个数A[k],
使得i<k<j,2×A[k]!=A[i]+A[j].的一个排列

别人思路:这个问题有一个非常美妙的数学解法。首先我们要证明漂亮数组满足这样几种性质
1.减法(减去一个数仍然是漂亮数组)
(A[k]−x)∗2=A[k]∗2−2∗x≠(A[i]−x+A[j]−x) (A[k]-x)*2=A[k]2 - 2x \neq(A[i] -x + A[j] - x)(A[k]−x)∗2=A[k]∗2−2∗x
=(A[i]−x+A[j]−x)
2.乘法(乘上一个数仍然是漂亮数组)
A[k]∗2∗x≠(A[i]+A[j])∗x=A[i]∗x+A[j]∗xA[k]2x\neq(A[i]+A[j])*x=A[i]*x+A[j]*xA[k]∗2∗x =(A[i]+A[j])∗x=A[i]∗x+A[j]∗x

有了上面这两个性质,我们就可以很快解决这个问题了。我们知道一个数组A可以分为奇数部分A1和偶数部分A2。此时我们如果有一个漂亮数组B,我们根据前面的性质知道2B-1是一个漂亮数组并且是奇数数组,而2B也是一个漂亮数组并且是偶数数组。那么我们通过2B+2B-1必然可以构成任意一个漂亮数组了。

class Solution {
    public int[] beautifulArray(int N) {
        List<Integer> list = new ArrayList<Integer>() ;
        list.add(1) ;
        while(list.size()<N){
            List<Integer> temp = new ArrayList<Integer>() ;
            for(int i : list){
                if(i*2-1<=N){
                    temp.add(i*2-1) ;
                }
            }
            for(int i : list){
                if(i*2<=N){
                    temp.add(i*2) ;
                }
            }
            list = temp ;
        }
        int a[] = new int[list.size()] ;
        for(int i=0;i<list.size();i++){
            a[i] = list.get(i) ;
        }
        return a ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值