分享巧克力
你有一大塊巧克力,它由一些甜度不完全相同的小塊組成。我們用陣列 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...