美文网首页
每天一道算法题7

每天一道算法题7

作者: 雨打空城 | 来源:发表于2022-01-20 10:42 被阅读0次

    【分治法 a + c != 2*b】
    给定一个正整数M,请构造出一个长度为M的数组arr,要求对任意的i,j,k三个位置,如果i < j < k, 都有arr[i] + arr[k] != 2 *arr[j]

    解答:这题有点跳,如果假设找到了三个数,a,b,c 满足a+c != 2 * b, 则(2a-1) + (2 * c - 1) != 2 * (2b -1), 同样,2a + 2b != 2c
    所以就可以从3个数,构造成6个数,满足条件,左边是这三个数的奇数,右边是这三个数的偶数。
    因为如果i,j,k都在左侧,满足条件,如果都在右侧,也是满足条件,如果i,j 在左侧,k 在右侧,则奇 + 偶 != 2 * 偶, 所以这样的组合一定满足条件。那6个数找到了,就一定能找到12个数,自然而然就都找到了。所以M一直除2,找到最小的数量满足条件,即1个数[1]

    
    public class MakeNumber {
        public static int[] makeNumber(int size) {
            if (size == 1) {
                return new int[]{1};
            }
            int halfSize = (size + 1) / 2;
            int[] base = makeNumber(halfSize);
            int[] ans = new int[size];
            int index = 0;
            for (; index < halfSize;index++) {
                ans[index] = base[index] * 2 + 1;
            }
    
            for (int i = 0; index < size; index++, i++) {
                ans[index] = base[i] * 2;
            }
            return ans;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:每天一道算法题7

          本文链接:https://www.haomeiwen.com/subject/khkdhrtx.html