每天两道LeetCodeHard:(52)

117 阅读1分钟

330. 按要求补齐数组

算法不难,为什么这是对的很难

题干:

给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。

解释:

纯数学题,想到就会写,没想到就写不粗来,面试的时候几乎没有写出来的可能,仅供学习吧

思考:

完全不知道咋做.看了答案才明白原来这个题的突破口在于,每次要补充的数字m,之前的(1,m-1)都是已经被完全覆盖的. 所以加上m之后,(1,m),(m,2m-1)也就是(1,2m-1)也是被完全覆盖的.这样就可以最大程度的延伸覆盖区域,直到完全被覆盖的次数最少.

答案:

public class Solution {
    public int minPatches(int[] nums, int n) {
        int patches = 0, i = 0;
        long miss = 1; // use long to avoid integer overflow error
        while (miss <= n) {
            if (i < nums.length && nums[i] <= miss) // miss is covered
                miss += nums[i++];
            else { // patch miss to the array
                miss += miss;
                patches++; // increase the answer
            }
        }
        return patches;
    }
}

答案补充:

贪心算法,写出来不难,关键是想不到