文章講解:代碼隨想錄
視頻講解:手把手帶你撕出正確的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_嗶哩嗶哩_bilibili
class Solution {
public:int search(vector<int>& nums, int target) {int left=0;//左邊界int right=nums.size()-1;//右邊界while(left<=right){int middle=(left+right)/2;if(nums[middle]<target){left=middle+1;}else if(nums[middle]>target){right=middle-1;}else{return middle;}}return -1;}
注意二分查找應用的條件 單調或者局部單調的數據或者別的數據結構。二分法要定義區間的左邊界和有邊界。并且根據區間的左右邊界的開閉設計的算法也不同。
題目是單調遞增的數據。解法注意是當中間節點不符合目標時,要更新查找區間。首先while()循環,既然left<=right;可以取等號,那么一定是左閉右閉的區間。接下來找到中間節點,當中間結點小于目標時,證明目標節點在右側,此時要更新左邊界,left=middld+1是因為nums[middle]已經查找過middle結點了,所以跳過他;當中間節點大于目標時,證明目標在左側,此時要更新右邊界,為什么是right=middle-1;同樣的,首先是因為已經查找過這個middle節點,不需要再查一遍了,并且因為是右閉的區間。
左閉右開的解法
public:int search(vector<int>& nums, int target) {int left=0;//左邊界int right=nums.size();//右邊界while(left<right){int middle=(left+right)/2;if(nums[middle]<target){left=middle+1;}else if(nums[middle]>target){right=middle;}else{return middle;}}return -1;}
};
【經典排序算法】二分查找法 (動圖演示 + C 語言代碼實現)_二分查找動圖-CSDN博客
雙指針法
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slow=0;//慢指針//int fast=0;//快指針for(int fast=0;fast<nums.size();fast++){if(nums[fast]!=val){nums[slow]=nums[fast];slow++;}else{continue;}}return slow;}
};
?暴力解法就是兩次for循環。雙指針法就是用一次就行了。
- 快指針:尋找新數組的元素 ,新數組就是不含有目標元素的數組
- 慢指針:指向更新 新數組下標的位置
首先如果nums[fast]!=val,原地更新,比如所有的元素中都沒有我們要找的,那么遍歷一遍之后數組還原來的數據。
如果nums[fast]==val,證明找到了我們想要的元素,那么此時slow和fast指向的都是這個想要替代的元素,那么slow不變,fast繼續+1,繼續尋找下一個我們不想替換的元素,如果找到不是我們想要的元素,那么就讓slow索引下的元素等于fast索引下的元素,也就是用后面不是想要替代的元素去替代我們想要替代的元素。
最后fast遍歷完一次,slow就是剩下的元素個數。
依照此法已經解決的題目
26. 刪除有序數組中的重復項 - 力扣(LeetCode)