LeetCode ソリューションの概要 2560. 強盗 IV

 ディレクトリリンク:

Likou プログラミングの質問 - 解決策の概要_共有 + 録音 - CSDN ブログ

GitHub 同期問題解決プロジェクト:

https://github.com/ September26/java-algorithms

元のタイトルのリンク:

LeetCode 公式ウェブサイト - 世界中のオタクに愛されるテクノロジー成長プラットフォーム


説明する:

通り沿いには家並みが続いています。各家には一定量の現金が隠されています。今、泥棒がこれらの家から現金を盗もうと計画しています。

泥棒は、相互接続された盗難防止システムを備えているため、近隣の家 から盗むことはできません 。

泥棒の 窃盗能力は、 窃盗の過程で 1 つの家から盗むことができる 最大金額として定義されます 。

nums 各家に保管されている現金の量を表す整数の配列が与えられます 。i 正式には、左から 最初の 家にはnums[i] 米ドルが入っています。

k また、泥棒が盗む 家の最小数を表す整数も与えられます  。泥棒はいつでも少なくとも k 1 軒の家を盗むことができます。

泥棒の 最低限の 盗み能力を返します。

例 1:

入力: nums = [2,3,5,9]、k = 2
出力: 5
説明:
泥棒は少なくとも 2 軒の家を盗みます。方法は 3 つあります: 
- インデックス 0 と 2 の家を盗みます。盗み能力は最大です。 ( nums[0], nums[2]) = 5。
- インデックス 0 と 3 の家を盗みます。盗み能力は max(nums[0], nums[3]) = 9 です。
- 添え字 1 と 3 の家を盗みます。盗み能力は max(nums[1], nums[3]) = 9 です。
したがって、min(5, 9, 9) = 5 が返されます。

例 2:

入力: nums = [2,7,9,3,1]、k = 2
出力: 2
説明:盗む方法は 7 つあります。最小の盗み能力は、添え字 0 および 4 で家を盗むことに対応します。max(nums[0], nums[4]) = 2 を返します。

ヒント:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109
  • 1 <= k <= (nums.length + 1)/2

問題解決のアイデア:

* 問題解決のアイデア:

* 二分探索法。最初に中間を見つけ、その中間が k 個の要件をサポートしているかどうかを確認します。

* K がサポートされているかどうかを判断するには、count などの num の範囲内で中央より小さい 1 の最大数を見つけようとします。

* count>=k の場合は、middle がサポートされ、upper が更新されることを意味し、それ以外の場合は、 lower が更新されます。

コード:

class Solution2560
{
public:
    int minCapability(vector<int> &nums, int k)
    {
        int maxValue = *max_element(nums.begin(), nums.end());
        int minValue = *min_element(nums.begin(), nums.end());
        int abs = maxValue;
        while (minValue <= maxValue)
        {
            int middle = (minValue + maxValue) / 2;
            bool visted = false;
            int count = 0;
            for (int num : nums)
            {
                if (num <= middle && !visted)
                {
                    count++;
                    visted = true;
                }
                else
                {
                    visted = false;
                }
            }
            if (count >= k)
            {
                abs = middle;
                maxValue = middle - 1;
            }
            else
            {
                minValue = middle + 1;
            }
        }
        return abs;
    }
};

おすすめ

転載: blog.csdn.net/AA5279AA/article/details/133045517