LeetCode刷題之路 二分法

2021-10-13 03:35:08 字數 1957 閱讀 7681

分享巧克力

你有一大塊巧克力,它由一些甜度不完全相同的小塊組成。我們用陣列 sweetness 來表示每一小塊的甜度。

你打算和 k 名朋友一起分享這塊巧克力,所以你需要將切割 k 次才能得到 k+1 塊,每一塊都由一些 連續 的小塊組成。

為了表現出你的慷慨,你將會吃掉 總甜度最小 的一塊,並將其餘幾塊分給你的朋友們。

請找出乙個最佳的切割策略,使得你所分得的巧克力 總甜度最大,並返回這個 最大總甜度。

示例 1:

輸入:sweetness = [1,2,3,4,5,6,7,8,9], k = 5

輸出:6

解釋:你可以把巧克力分成 [1,2,3], [4,5], [6], [7], [8], [9]。

示例 2:

輸入:sweetness = [5,6,7,8,9,1,2,3,4], k = 8

輸出:1

解釋:只有一種辦法可以把巧克力分成 9 塊。

示例 3:

輸入:sweetness = [1,2,2,1,2,2,1,2,2], k = 2

輸出:5

解釋:你可以把巧克力分成 [1,2,2], [1,2,2], [1,2,2]。

0 <= k < sweetness.length <= 10^4

1 <= sweetness[i] <= 10^5

思路:首先注意這塊蛋糕是連續的,切割後的小塊蛋糕也必須是連續的;

二分查詢 切割的塊的大小sweetsize

如果以當前sweetsize進行切割,切割塊數 >= k+1,則sweetsize偏小,left = mid + 1,並更新out;

如果以當前sweetsize進行切割,切割塊數 < k+1,則sweetsize偏大,right = mid - 1,並更新out;

class solution 

} return cnt;

} int maximizesweetness(vector& sweetness, int k)

int minval = 0x7fffffff; // init with the biggest value 0x7fffffff for minval.

int sum = 0;

for (auto& i : sweetness)

if (k == 0)

if (k + 1 >= sweetness.size())

int out = minval;

int begin = minval;

int end = sum;

while (1)

int mid = (begin + end) / 2;

int blocknum = getblocknum(sweetness, mid);

if (blocknum >= k + 1) else

} return out;

}};

該二分演算法缺陷:

⽐如說給你有序陣列 nums = [1,2,2,2,3] , target 為 2,此演算法返回的索

引是 2,沒錯。但是如果我想得到 target 的左側邊界,即索引 1,或者我

想得到 target 的右側邊界,即索引 3,這樣的話此演算法是⽆法處理的。

改進,核心**塊(來自labuladong的演算法小抄)

int

left_bound

(int

nums,

int target)

else

if(nums[mid]

> target)

else

if(nums[mid]

== target)

}// 檢查出界情況

if(left >= nums.length || nums[left]

!= target)

return left;

}

leetcode刷題筆記 二分法

記錄一下,方便複習 leetcode 33 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法...

python之路 遞迴, 二分法

自己呼叫自己,遞迴的入口 引數 和 出口 return 樹形結構的遍歷.def func print 我是遞迴 func func 樹形結構的遍歷 import osdef func lujing,n d a lst os.listdir lujing 開啟資料夾.列出該資料夾內的所有檔名 for ...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...