|
53 | 53 |
|
54 | 54 | <!-- 这里可写通用的实现逻辑 -->
|
55 | 55 |
|
| 56 | +**方法一:贪心** |
| 57 | + |
| 58 | +我们假设数字 $x$ 是最小的不能表示的正整数,那么 $[1,..x-1]$ 的这些数都是可以表示的。为了能表示数字 $x$,我们需要添加一个小于等于 $x$ 的数: |
| 59 | + |
| 60 | +- 如果添加的数等于 $x$,由于 $[1,..x-1]$ 的数都可以表示,添加 $x$ 后,区间 $[1,..2x-1]$ 内的数都可以表示,最小的不能表示的正整数变成了 $2x$。 |
| 61 | +- 如果添加的数小于 $x$,不妨设为 $x'$,由于 $[1,..x-1]$ 的数都可以表示,添加 $x'$ 后,区间 $[1,..x+x'-1]$ 内的数都可以表示,最小的不能表示的正整数变成了 $x+x' \lt 2x$。 |
| 62 | + |
| 63 | +因此,我们应该贪心地添加数字 $x$,这样可以覆盖的区间更大。 |
| 64 | + |
| 65 | +我们用一个变量 $x$ 记录当前不能表示的最小正整数,初始化为 $1$,此时 $[1,..x-1]$ 是空的,表示当前没有任何数可以被覆盖;用一个变量 $i$ 记录当前遍历到的数组下标。 |
| 66 | + |
| 67 | +循环进行以下操作: |
| 68 | + |
| 69 | +- 如果 $i$ 在数组范围内且 $nums[i] \le x$,说明当前数字可以被覆盖,因此将 $x$ 的值加上 $nums[i]$,并将 $i$ 的值加 $1$。 |
| 70 | +- 否则,说明 $x$ 没有被覆盖,因此需要在数组中补充一个数 $x$,然后 $x$ 更新为 $2x$。 |
| 71 | +- 重复上述操作,直到 $x$ 的值大于 $n$。 |
| 72 | + |
| 73 | +最终答案即为补充的数的数量。 |
| 74 | + |
| 75 | +时间复杂度 $O(m + \log n)$,其中 $m$ 为数组 $nums$ 的长度。空间复杂度 $O(1)$。 |
| 76 | + |
56 | 77 | <!-- tabs:start -->
|
57 | 78 |
|
58 | 79 | ### **Python3**
|
59 | 80 |
|
60 | 81 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
61 | 82 |
|
62 | 83 | ```python
|
63 |
| - |
| 84 | +class Solution: |
| 85 | + def minPatches(self, nums: List[int], n: int) -> int: |
| 86 | + x = 1 |
| 87 | + ans = i = 0 |
| 88 | + while x <= n: |
| 89 | + if i < len(nums) and nums[i] <= x: |
| 90 | + x += nums[i] |
| 91 | + i += 1 |
| 92 | + else: |
| 93 | + ans += 1 |
| 94 | + x <<= 1 |
| 95 | + return ans |
64 | 96 | ```
|
65 | 97 |
|
66 | 98 | ### **Java**
|
67 | 99 |
|
68 | 100 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
69 | 101 |
|
70 | 102 | ```java
|
| 103 | +class Solution { |
| 104 | + public int minPatches(int[] nums, int n) { |
| 105 | + long x = 1; |
| 106 | + int ans = 0; |
| 107 | + for (int i = 0; x <= n;) { |
| 108 | + if (i < nums.length && nums[i] <= x) { |
| 109 | + x += nums[i++]; |
| 110 | + } else { |
| 111 | + ++ans; |
| 112 | + x <<= 1; |
| 113 | + } |
| 114 | + } |
| 115 | + return ans; |
| 116 | + } |
| 117 | +} |
| 118 | +``` |
| 119 | + |
| 120 | +### **C++** |
| 121 | + |
| 122 | +```cpp |
| 123 | +class Solution { |
| 124 | +public: |
| 125 | + int minPatches(vector<int>& nums, int n) { |
| 126 | + long long x = 1; |
| 127 | + int ans = 0; |
| 128 | + for (int i = 0; x <= n;) { |
| 129 | + if (i < nums.size() && nums[i] <= x) { |
| 130 | + x += nums[i++]; |
| 131 | + } else { |
| 132 | + ++ans; |
| 133 | + x <<= 1; |
| 134 | + } |
| 135 | + } |
| 136 | + return ans; |
| 137 | + } |
| 138 | +}; |
| 139 | +``` |
| 140 | +
|
| 141 | +### **Go** |
| 142 | +
|
| 143 | +```go |
| 144 | +func minPatches(nums []int, n int) (ans int) { |
| 145 | + x := 1 |
| 146 | + for i := 0; x <= n; { |
| 147 | + if i < len(nums) && nums[i] <= x { |
| 148 | + x += nums[i] |
| 149 | + i++ |
| 150 | + } else { |
| 151 | + ans++ |
| 152 | + x <<= 1 |
| 153 | + } |
| 154 | + } |
| 155 | + return |
| 156 | +} |
| 157 | +``` |
71 | 158 |
|
| 159 | +### **TypeScript** |
| 160 | + |
| 161 | +```ts |
| 162 | +function minPatches(nums: number[], n: number): number { |
| 163 | + let x = 1; |
| 164 | + let ans = 0; |
| 165 | + for (let i = 0; x <= n; ) { |
| 166 | + if (i < nums.length && nums[i] <= x) { |
| 167 | + x += nums[i++]; |
| 168 | + } else { |
| 169 | + ++ans; |
| 170 | + x *= 2; |
| 171 | + } |
| 172 | + } |
| 173 | + return ans; |
| 174 | +} |
72 | 175 | ```
|
73 | 176 |
|
74 | 177 | ### **...**
|
|
0 commit comments