//二分查找 //二分查找1.最左边的第一位 //二分查找2.最右边的第一位 #include <iostream> #include <vector> using namespace std; //最基本的二分查找无法确定找到的是哪一个最先找到的输出 int FristBinarySearch(vector<int> nums,int target){ int left=0,right=nums.size()-1; int mid=0; while(left<=right){ mid=left+(right-left)/2; if(nums[mid]<target) left=mid+1; else right=mid-1; } if(nums[left]!=target||left==nums.size()) return -1;//主要是先后顺序,否则找不到值 return left; } //给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 //如果目标值不存在于数组中,返回它将会被按顺序插入的位置 int searchInsert(vector<int>& nums, int target) { int left=0,right=nums.size()-1; while(left<=right) { int mid=left+((right-left)>>1); if(target>nums[mid]) left=mid+1; else right=mid-1; } //返回做的意义就是满足左界变化的相反条件的第一个位置 //target>nums[mid]相反就是第一个nums[mid]大于等于target的下标位置 return left; } //求峰值且左右已排序arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] int peakIndexInMountainArray(vector<int>& arr) { int left=0,right=arr.size()-1; while(left<=right) { int mid=left+((right-left)>>1); if(arr[mid]<arr[mid+1]) left=mid+1; else right=mid-1; } //返回做的意义就是满足左界变化的相反条件的第一个位置 //arr[mid]<arr[mid+1]相反就是第一个arr[mid]大于等于arr[mid+1]的下标位置 return left; } //二分查找4.大于等于的第一位 int bigandequ(vector<int> nums,int target){ int left=0,right=nums.size()-1; int mid=0; while(left<=right){ mid=left+(right-left)/2; if(nums[mid]<target) left=mid+1; else right=mid-1; } if(left==nums.size()) return -1;//主要是先后顺序,否则找不到值 //返回做的意义就是满足左界变化的相反条件的第一个位置 //target>nums[mid]相反就是第一个nums[mid]大于等于target的下标位置 return left; } int Lastbigandequ(vector<int> nums,int target){ int left=0,right=nums.size()-1; int mid=0; while(left<=right){ mid=left+(right-left)/2; if(nums[mid]>target) right=mid-1; else left=mid+1; } //返回做的意义就是满足右界变化的相反条件的最后一个位置 //target<nums[mid]相反就是最后一个nums[mid]小于等于target的下标位置 return right; } int LastBinarySearch(vector<int> nums,int target){ int left=0,right=nums.size()-1; int mid=0; while(left<=right){ mid=left+(right-left)/2; if(nums[mid]>target) right=mid-1; else left=mid+1; } if(right<0||nums[right]!=target) return-1; return right; } int BinarySearch(vector<int> nums,int target){ int left=0,right=nums.size()-1; int mid=0; while(left<=right){ mid=left+(right-left)/2; if(nums[mid]==target) return mid; else if(nums[mid]>target) right=mid-1; else left=mid+1; } return -1; } int main(){ int a = FristBinarySearch({1,2,3,3,3},9); int b = LastBinarySearch({1,2,3,3,3},3); int c = BinarySearch({1,2,3,3,3,4,4},3); int d = bigandequ({1,2,4,4,4,4,4},3); int e = Lastbigandequ({1,2,2,2,2,4,4,4,4,4},3); cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl<<e; }
二分查找 2022/3/28
于 2022-03-28 23:58:37 首次发布