二分查找难点在于区间开闭,一般分为左闭右闭和左闭右开,区别在于while判断是否包含等于
左闭右闭:条件判断有等于,r=mid-1
class Solution { public: int search(vector<int>& nums, int target) { int l = 0, r = nums.size() - 1; while(l <= r){ int mid = l + (r-l)/2; if(nums[mid] == target) return mid; else if(nums[mid] < target) l = mid+1; else r = mid-1; } return -1; } };
左闭右开:条件判断没有等于,r=mid
class Solution { public: int search(vector<int>& nums, int target) { int l = 0, r = nums.size(); while(l < r){ int mid = l + (r-l)/2; if(nums[mid] == target) return mid; else if(nums[mid] < target) l = mid+1; else r = mid; } return -1; } };
双指针:左指针指向的数字若等于val,则替换为右指针的数字,右指针左移;否则左指针右移,直到左指针索引大于右指针索引
class Solution { public: int removeElement(vector<int>& nums, int val) { int l = 0,r = nums.size()-1; while(l <= r){ if(nums[l] == val){ nums[l] = nums[r--]; }else{ l++; } } return l; } };
浙公网安备 33010602011771号