ディレクトリリンク:
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;
}
};