![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
二分查找
two points
baixiaofei567
如果十年前没种树,那最好的时间是现在
展开
-
1011. 在 D 天内送达包裹的能力
很好的题,一开始想dfs爆搜的,还是直接看了三叶学姐的题解。是一道二分查找的题,我们要找的是能在D天内送完的最小载重量。不考虑天数的情况下最小的载重量是足够运送最大货物的,最大载重量就是所有货物一天运完。左边界就是max,有边界就是sum,对其进行二分,写一个check函数,这个很重要,对当前运力进行判断,这是我们二分缩小搜索范围的标准。check内部就是计算当前运力需要几天运完如果运送天数<=D,mid不能扔,继续去左边找,看看能否找到更小的。如果>D,就要提升载重量,去右边找,而且..原创 2021-04-27 00:09:41 · 132 阅读 · 0 评论 -
367. 有效的完全平方数
二分,本来可以把right设为sqrt(INT_MAX)的,但是不能用sqrt,所以还是把right设为INT_MAX吧,设为longlong就不会越界了。class Solution {public: bool isPerfectSquare(int num) { //二分查找 //1到sqrt(INT_MAX) long long int left = 1, right = INT_MAX; long long int mid.原创 2021-03-18 00:51:01 · 53 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
easy,二分即可,记得在扩大范围时判断是否越界。class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { //有序+logn=二分,因为有可能有多个相同数字,所以在找到target之后left--,right++,直到找到区间 if(nums.size() == 0) return vector<int>{-1,-.原创 2021-01-21 01:55:57 · 73 阅读 · 0 评论 -
153. 寻找旋转排序数组中的最小值
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0class Solution {public: int findMin(vector<int>& nums) { int l=0,r=n原创 2020-08-06 00:40:10 · 95 阅读 · 0 评论 -
278. 第一个错误的版本
顺序数组的查找,二分!因为不是数组,所以l初始化为1,r初始化为n。不是具体找某个数,l<r时退出即可,l就是正确答案。如果当前mid是错的,也不要丢弃,因为可能就是当前的,让r=mid。否则l=mid+1// The API isBadVersion is defined for you.// bool isBadVersion(int version);class Solution {public: int firstBadVersion(int n) { //.原创 2021-02-21 10:54:50 · 57 阅读 · 0 评论 -
540. 有序数组中的单一元素
位运算很舒服,可惜O(n),hash空复也是O(n)都不够优秀。查找就要考虑二分,其实这题就算不是有序的都无所谓,只要相同的放一起就行。是具体找某个数,而且一定有结果,所以l==r时退出,那么l就是答案。或者l>r时退出,答案就已经在循环中找到了就是要考虑到所有情况。这个数前后都不相同,就直接返回当前数字,不然这个数一定是重复的,所以我们将它移动到重复数字的前一个,判断它是在奇数个出现的还是偶数个出现的,如果是奇数个,证明前面是正常的,就去后面找,跳过当前的自己重复的,l=mid+2。如果是偶.原创 2021-02-21 10:52:24 · 99 阅读 · 0 评论 -
744. 寻找比目标字母大的最小字母
排序数组的查找,妥妥的二分,坑点就是先把边界判断。class Solution {public: char nextGreatestLetter(vector<char>& letters, char target) { //先把边界判断了 if(target >= letters[letters.size()-1] || target < letters[0]) return letters[0]; int l .原创 2021-02-21 01:11:38 · 64 阅读 · 0 评论 -
69. x 的平方根
这题还真的挺难的,明天好好看看二分class Solution {public: int mySqrt(int x) { int l = 0, r = x, res = -1; while(l <= r){ int mid = l + (r-l)/2; if((long long)mid*mid <= x){ res = mid; l = .原创 2021-02-04 01:24:57 · 93 阅读 · 0 评论