330. Patching Array
Дан sorted 配列 целых чисел nums и 整数 n. Добавьте/дополните elementы в 配列 таким образом, чтобы любое number в диапазоне [1, n] включительно могло быть сформировано как сумма некоторых elementов 配列а.
return минимальное количество дополнений, необходимых для этого.
例:
Input: nums = [1,3], n = 6
Output: 1
Explanation:
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.
C# 解法
照合済み/オリジナルpublic class Solution {
public int MinPatches(int[] nums, int n) {
int patches = 0, i = 0;
long miss = 1;
while (miss <= n) {
if (i < nums.Length && nums[i] <= miss) {
miss += nums[i++];
} else {
miss += miss;
patches++;
}
}
return patches;
}
}
C++ 解法
自動ドラフト、提出前に確認#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int MinPatches(vector<int>& nums, int n) {
int patches = 0, i = 0;
long miss = 1;
while (miss <= n) {
if (i < nums.size() && nums[i] <= miss) {
miss += nums[i++];
} else {
miss += miss;
patches++;
}
}
return patches;
}
}
Java 解法
照合済み/オリジナルpublic class Solution {
public int minPatches(int[] nums, int n) {
int patches = 0, i = 0;
long miss = 1;
while (miss <= n) {
if (i < nums.length && nums[i] <= miss)
miss += nums[i++];
else {
miss += miss;
patches++;
}
}
return patches;
}
}
JavaScript 解法
照合済み/オリジナルvar minPatches = function(nums, n) {
let patches = 0, i = 0, miss = 1;
while (miss <= n) {
if (i < nums.length && nums[i] <= miss) {
miss += nums[i++];
} else {
miss += miss;
patches++;
}
}
return patches;
};
Python 解法
照合済み/オリジナルclass Solution:
def minPatches(self, nums: List[int], n: int) -> int:
patches, i, miss = 0, 0, 1
while miss <= n:
if i < len(nums) and nums[i] <= miss:
miss += nums[i]
i += 1
else:
miss += miss
patches += 1
return patches
Algorithm
Инициализация переменных:
Создайте переменную miss, представляющую наименьшее пропущенное number, которое еще не покрыто, и установите ее значение на 1. Создайте переменную patches для подсчета необходимых дополнений и переменную i для итерации по 配列у nums.
Основной цикл:
Используйте цикл while, который будет выполняться до тех пор, пока miss не станет больше n.
Внутри цикла проверьте, покрывает ли текущий element nums[i] значение miss. Если да, добавьте nums[i] к miss и увеличьте i. Если нет, добавьте значение miss к самому себе (это означает добавление нового elementа в 配列) и увеличьте счетчик patches.
Возврат результата:
После завершения цикла return значение patches, которое представляет минимальное количество необходимых дополнений.
😎
Vacancies for this task
有効な求人 with overlapping task tags are 表示.