● 今日學習的文章鏈接和視頻鏈接
● 自己看到題目的第一想法
1. 704二分法:
方法一:
整個數組是 左閉右閉區間 [ ]
- left指針指向數組開始下標, right 指針指向數組最后下表nums.size()-1, mid為 (left+right) /2
- 循環條件 left<=right
- nums[mid] <target 右移left left = mid+1
nums[mid] > target 左移right right = mid-1
nums[mid] = target 返回 mid
找不到 返回 -1
方法二:
整個數組是 左閉右開區間 [ )
- left指針指向數組開始下標, right 指針指向數組最后下表nums.size(), mid為 (left+right) /2
- 循環條件 left< right
- nums[mid] <target 右移left left = mid+1
nums[mid] > target 左移right right = mid
nums[mid] = target 返回 mid
找不到 返回 -1
2.注意:區間邊界問題
整個數組是 左閉右閉區間 [ ]
整個數組是 左閉右開區間 [ )
3.具體代碼
方法一:
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0, right = nums.size()-1;while(left<=right){int mid = (left+right)/2;if(nums[mid] == target){return mid;}else if(nums[mid] >target){right = mid-1; }else if(nums[mid]< target){left = mid+1;}else{return mid;}}return -1; }
};
方法二:
class Solution {
public:int search(vector<int>& nums, int target) {int left =0;int right = nums.size();while(left< right){int mid = (left +right)/2;if(nums[mid] < target){left =mid+1;}else if(nums[mid] > target){right = mid;}else{return mid ;}}return -1;}
};
2. 27移除元素
思路
方法一:雙指針
- 定義下標 快指針fast , 慢指針slow
- 循環條件 fast <= nums.size()-1
- nums[fast] == val 則fast++;
nums[fast] != val 則 nums[slow] = nums[fast], slow++, fast++;
slow最終指向沒有val值 數組最后一個元素的下標。
方法二:
4. 定義left =0 right =nums.size()-1
5. 循環條件 left<=right
6. 左邊找到nums[left]==val 的下標
右邊找到nums[right] !=val 的下標
交換 nums[left] =nums[right] left++; right–;
結果: return left;
class Solution {
public:int removeElement(vector<int>& nums, int val) {int left =0;int right = nums.size()-1;while(left<=right){while(left<=right && nums[left] != val){left++;}while(left<=right && nums[right] == val){right--;}if(left<=right){nums[left] = nums[right];left++;right--;}}return left;}
};
注意
slow指:更新后 新數組下標
fast 指:尋找新數組的元素
代碼
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slow =0;int fast =0;for(fast = 0; fast <nums.size(); fast++){if(nums[fast] != val){nums[slow] = nums[fast];slow++;}}return slow;}
};