代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
704 二分查找:
-
二分查找法:
-
难点:
- 1,while循环 left< right 还是 left <= right
- 2, right 是mid 还是 mid -1
- 1,while循环 left< right 还是 left <= right
-
解题思路:
- 【思考当l ==r 是否合法】
- 1,先确定是[l,r],还是[l,r)
- 【思考当l ==r 是否合法】
-
具体步骤:
- 【l,r】
- 1,while(l <= r)
- 2,right = mid -1
- 因为right可能等于mid
- 因为right可能等于mid
- 1,while(l <= r)
- [l,r)
- 1,while(l < r)
- 2,right = mid
- 因为right不会等于mid
- 因为right不会等于mid
- 1,while(l < r)
- 【l,r】
-
- 核心代码:
1 #include<iostream> 2 #include "Array.h" 3 #include<vector> 4 5 using namespace std; 6 7 int binarySearch(vector<int>& nums, int target) 8 { 9 // [l,r] 10 int left = 0; 11 int right = nums.size() - 1; 12 13 while(left <= right) 14 { 15 int mid = (right - left) / 2 + left;//越界 16 if (nums[mid] == target) 17 { 18 return mid; 19 } 20 else if (nums[mid] < target) 21 { 22 left = mid + 1;// 为什么不是left = mid? 23 } 24 else if (nums[mid] > target) 25 { 26 //因为mid 可能等于 right,所以 mid不是target, right = mid -1; 27 right = mid - 1; 28 } 29 } 30 31 return -1; 32 }
27: 移除元素
1,难点:
当修改for循环值得时候,一定要注意不要移除
2,之前的错误:
#include<iostream> #include "Array.h" #include <vector> using namespace std; int removeElement(std::vector<int>& nums, int val) { // 快慢指针 // 快指针的值 -》 慢指针 int slow = 0; int fast = 0; for (fast = 0; fast < nums.size(); fast++) { // 这是个问题,当移动到要移除的结点的时候,就不要把值 ->数组了 if (nums[fast] != val) { slow++; } nums[slow] = nums[fast]; } return slow ; }
以上代码会导致溢出,应该这样写:
1 int removeElement(std::vector<int>& nums, int val) 2 { 3 // 快慢指针 4 // 快指针的值 -》 慢指针 5 int slow = 0; 6 int fast = 0; 7 8 for (fast = 0; fast < nums.size(); fast++) 9 { 10 // 这是个问题,当移动到要移除的结点的时候,就不要把值 ->数组了 11 if (nums[fast] != val) 12 { 13 nums[slow] = nums[fast]; 14 slow++; 15 } 16 17 } 18 19 return slow ; 20 }