Leetcode 704. 二分查找(简单) 34. 在排序数组中查找元素的第一个和最后一个位置(中等) 二分查找以及边界查找
labuladong解法
704. 二分查找(简单)
题目:
二分查找
思路:
class Solution { public: int search(vector<int>& nums, int target) { int left=0,right=nums.size()-1; while(left<=right){ int mid=left+(right-left)/2; if(nums[mid]==target) return mid; else if(nums[mid]<target) left=mid+1; else right=mid-1; } return -1; } };
34. 在排序数组中查找元素的第一个和最后一个位置(中等)
题目:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
思路:
查找相同元素的左右边界。只需要在原本二分查找的基础上改变等于target时的策略
对于左边界,等于target时不断缩减right,然后返回left
对于右边界,等于target时不断缩减left,然后返回right
注意返回时要先进行判定其是否越界或是否等于target
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { int leftbound=searchRangeLeft(nums,target); int rightbound=searchRangeRight(nums,target); return {leftbound,rightbound}; } int searchRangeLeft(vector<int>& nums, int target){ int left=0,right=nums.size()-1; while(left<=right){ int mid=left+(right-left)/2; if(nums[mid]<target) left=mid+1; else if(nums[mid]>target) right=mid-1; else if(nums[mid]==target) right=mid-1;// 别返回,锁定左侧边界 } // 最后要检查 left 越界的情况 if(left>=nums.size()||nums[left]!=target) return -1; return left; } int searchRangeRight(vector<int>& nums, int target){ int left=0,right=nums.size()-1; while(left<=right){ int mid=left+(right-left)/2; if(nums[mid]<target) left=mid+1; else if(nums[mid]>target) right=mid-1; else if(nums[mid]==target) left=mid+1;// 别返回,锁定右侧边界 } // 最后要检查 right 越界的情况 if(right<0||nums[right]!=target) return -1; return right; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=