在算法中我们常用二分法求解一些问题。
什么时候能用二分呢?通常在一个可以求得的区间内,我们可以假定yes和no两种对立情况,可以分析出其中有yes和no的两个连续部分,即yes区间后接着no区间,或者相反。在这种下大概率可以使用二分法,这只是一种经验总结,不具有普遍性。
二分什么量,怎么用二分法?一般来说在设定场景中设问什么,就二分什么。如果代求量不明晰,则可以通过一定的转换转换成可以二分的值,要满足上述所述能用二分的条件。其次在使用二分时,遵循以下步骤: 1.确定二分的区间范围; 2.假设答案x; 3.明确x为yes或为no的条件; 4.编写代码。
一种通用的二分法写法 int findTarget(vector<int>& nums, int target) { // 确定二分范围 int left = 0, right = nums.size(); // 开始二分查找目标 while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { // 这时的mid落在了正确答案的左边 left = mid + 1; } else { right = mid; } } return left; // 返回left和right都一样 }附: leetcode中对应的二分练手题(外加了贪心算法): https://leetcode-cn.com/problems/split-array-largest-sum/
本文参考了以下知乎的问题回答,其中有更详细的介绍: https://www.zhihu.com/question/36132386