330. Patching Array

LeetCode hard original: C# #array #backtracking #csharp #hard #leetcode #sort
選択した UI 言語に合わせて問題文をロシア語から翻訳します。コードは変更しません。

Дан 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 表示.

すべての求人
有効な求人はまだありません。