
二分查找
cx_cs
这个作者很懒,什么都没留下…
展开
-
81. 搜索旋转排序数组 II
无原创 2023-03-08 11:29:44 · 57 阅读 · 0 评论 -
35. 搜索插入位置
无原创 2022-08-18 10:14:15 · 63 阅读 · 0 评论 -
162. 寻找峰值
要求:峰值是严格大于左右,边界也算,要O(logn)思路:题目说了相邻两个数不相等。二分。如果nums[mid]<nums[mid+1]则峰值在右边class Solution {public: int findPeakElement(vector<int>& nums) { int l=0,r=nums.size()-1; while(l<r){ int mid=(l+r)/2;原创 2022-04-05 20:18:03 · 66 阅读 · 0 评论 -
33. 搜索旋转排序数组
要求:找target思路:二分不完全二分,以rightleft判断class Solution {public: int search(vector<int>& nums, int target) { int n=nums.size(); int left=0,right=n-1; while(left<=right){ int mid=left+(right-left>>1);原创 2022-03-18 13:45:51 · 109 阅读 · 0 评论 -
154. 寻找旋转排序数组中的最小值 II
要求:有重复元素旋转数组找最小值思路:区别为重复,找第一个class Solution {public: int findMin(vector<int>& nums) { int n=nums.size(); int left=0,right=n-1; while(left<=right){ int mid=left+((right-left)>>1); //有原创 2022-03-02 20:17:02 · 96 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
要求:如题思路:二分找两次,左边界和右边界,注意左边界找不到的话left会大于n。如果left<=right等号去掉,那么mid+1或者mid-1会去掉一个加减1class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { //找左边界和右边界 int n=nums.size(); if(n==0)return原创 2021-10-10 19:09:35 · 68 阅读 · 0 评论 -
153. 寻找旋转排序数组中的最小值
要求:456123这样的数组找最小的即1思路:二分,找左边界,返回left,这里二分有个问题是mid跟谁比较?答案是可以选最右边的数,可以把左边界定义为第一个小于nums[n-1]的数,这种毫无章法只能想清楚细节再写class Solution {public: int findMin(vector<int>& nums) { int n=nums.size(); int left=0,right=n-1; if(nums[l原创 2021-10-10 18:47:53 · 75 阅读 · 0 评论 -
278. 第一个错误的版本
要求:如题思路:二分的左边界,返回left,只有两种情况,无脑用就行了// The API isBadVersion is defined for you.// bool isBadVersion(int version);class Solution {public: int firstBadVersion(int n) { int left=1,right=n; while(left<=right){ int mid=le原创 2021-10-10 13:40:00 · 57 阅读 · 0 评论 -
540. 有序数组中的单一元素
要求:有序数组中的数都是两个只有一个数是一个,找出此数思路:二分直接找数,找与mid相等的数,看这两个数下标来判断那个单独的数在左还是右,先奇后偶在左边,反之右边。需要注意的是判断奇数时位运算&优先级比==还低。。class Solution {public: int singleNonDuplicate(vector<int>& nums) { int n=nums.size(); int left=0,right=n-1;原创 2021-10-10 12:10:57 · 67 阅读 · 0 评论 -
744. 寻找比目标字母大的最小字母
要求:找比target大的第一个字符思路:找二分的左边界,返回left,因为左边界要保持大于target,所以说mid处的值等于target时要动左边界class Solution {public: char nextGreatestLetter(vector<char>& letters, char target) { int n=letters.size(); if(target>=letters[n-1])return lette原创 2021-10-10 11:38:32 · 64 阅读 · 0 评论 -
69. Sqrt(x)
要求:求算术平方根思路:二分。本题可以理解为找最后一个平方小于等于x的数,即右边界,所以最后返回right。注意当mid*mid<x时,left=mid+1可能会大于结果,但是最终right会是left-1因为循环终止条件,可见left刚好是右边界右一位。本题不用考虑找不到返回-1class Solution {public: int mySqrt(int x) { int left=0,right=x; while(left<=right){原创 2021-10-10 11:12:03 · 90 阅读 · 0 评论