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;
}
}
答案补充:
贪心算法,写出来不难,关键是想不到