Patching Array

Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n]inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required.

Example 1:
nums = [1, 3]n = 6
Return 1.

Combinations of nums are [1], [3], [1,3], which form possible sums of: 1, 3, 4.
Now if we add/patch 2 to nums, the combinations are: [1], [2], [3], [1,3], [2,3], [1,2,3].
Possible sums are 1, 2, 3, 4, 5, 6, which now covers the range [1, 6].
So we only need 1 patch.

Example 2:
nums = [1, 5, 10]n = 20
Return 2.
The two patches can be [2, 4].

Example 3:
nums = [1, 2, 2]n = 5
Return 0.

分析:

这里面有个规律,如果不知道这个规律,这题很难做出来吧。

什么规律呢?如果数组前面的几个数加起来等于一个数k,那么k之前的数都可以通过数组里的数组合而成。但是这里还有一个条件,那就数组里的数一定能够把 1 到 k之间的任何数通过组合的形式实现出来。

具体实现:http://www.cnblogs.com/grandyang/p/5165821.html

我们定义一个变量miss,用来表示[0,n]之间最小的不能表示的值,那么初始化为1,为啥不为0呢,因为n=0没啥意义,直接返回0了。那么此时我们能表示的范围是[0, miss),表示此时我们能表示0到miss-1的数,如果此时的num <= miss,那么我们可以把我们能表示数的范围扩大到[0, miss+num),如果num>miss,那么此时我们需要添加一个数,为了能最大限度的增加表示数范围,我们加上miss它本身,以此类推直至遍历完整个数组,我们可以得到结果。下面我们来举个例子说明:

给定nums = [1, 2, 4, 11, 30], n = 50,我们需要让[0, 50]之间所有的数字都能被nums中的数字之和表示出来。

首先使用1, 2, 4可能表示出0到7之间的所有数,表示范围为[0, 8),但我们不能表示8,因为下一个数字11太大了,所以我们要在数组里加上一个8,此时能表示的范围是[0, 16),那么我们需要插入16吗,答案是不需要,因为我们数组有1和4,可以组成5,而下一个数字11,加一起能组成16,所以有了数组中的11,我们此时能表示的范围扩大到[0, 27),但我们没法表示27,因为30太大了,所以此时我们给数组中加入一个27,那么现在能表示的范围是[0, 54),已经满足要求了,我们总共添加了两个数8和27,所以返回2即可。

 1 public class Solution {
 2     public int minPatches(int[] nums, int n) {
 3         long miss = 1;
 4         int res = 0, i = 0;
 5         while (miss <= n) {
 6             if (i < nums.length && nums[i] <= miss) {
 7                 miss += nums[i++];
 8             } else {
 9                 miss += miss;
10                 ++res;
11             }
12         }
13         return res;
14     }
15 }
时间: 2024-08-11 09:47:22

Patching Array的相关文章

[LeetCode]Patching Array

题目:Patching Array Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n]inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches

330. Patching Array

/* * 330. Patching Array * 2016-7-9 by Mingyang * hehe */ public int minPatches(int[] nums, int n) { if (n <= 0) return 0; nums = nums == null ? new int[0] : nums; int current_ind = 0, ret = 0; long boundary_val = 1, sum = 0; while (boundary_val <=

[LeetCode][JavaScript]Patching Array

Patching Array Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches re

leetcode 330. Patching Array

传送门 330. Patching Array My Submissions QuestionEditorial Solution Total Accepted: 8597 Total Submissions: 29516 Difficulty: Medium Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in ra

leetcode笔记:Patching Array

一. 题目描述 Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required.

[LeetCode] Patching Array 补丁数组

Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required. Example

【Leetcode】Patching Array

题目链接: 题目: Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches require

[Swift]LeetCode330. 按要求补齐数组 | Patching Array

Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required. Example

刷题顺序表 Array

题号 题目链接 说明 基础 27 Remove Element 26 Remove Duplicates from Sorted Array 80 Remove Duplicates from Sorted Array II 277 Find the Celebrity 189 Rotate Array 41 First Missing Positive 299 Bulls and Cows 134 Gas Station 118 Pascal's Triangle 很少考 119 Pascal