大四老狗洗心革面重学算法sos,希望坚持到底,厂子捞捞
状态:卡语法,卡算法,菜菜
学习时长:2h13min
704. 二分查找
相关题目: 35.搜索插入位置。34. 在排序数组中查找元素的第一个和最后一个位置 。
目标:熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
题目链接:二分704
文章讲解:代码随想录
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
蒙眼:发现自己不太会处理数组越界,计算索引时取上界取下界想不太清楚,需要统一一下。
#include <algorithm>
#include <cmath>
using namespace std;
class Solution {
public:
int search(vector<int>& nums, int target) {
int left= 0;
int right = nums.size()-1;
// index
// cout<<*left<<endl;
// cout<<*right<<endl;
int mid = nums.size()/2;
cout<<mid<<endl;
while(left!=right&&(right-1>left)){
if(nums[mid]==target) return mid;
if(nums[mid]>target){
right = mid;
}else{
left = mid;
}
mid = (right+left)/2;
cout<<mid<<endl;
}
if(nums[left]==target) return left;
if(nums[right]==target) return right;
return -1;
}
};
修改,注意区间:直接粘了
注意点是区间变化对应的代码变化
二分时的middle永远取下界,因为left一直闭。
// 版本一
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
// 3. 区间变化时不减一
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
// 1. while条件在区间变化要变
int middle = left + right)/2;
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
// right在区间变化时修改为middle
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,所以[middle + 1, right]
} else { // nums[middle] == target
return middle; // 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1;
}
};
27. 移除元素
覆盖即删除
1. 暴力写法写一遍
两遍for循环
第一个for循环需要更新数组,注意循环判断i<size那里要对应更新size,因为更新数组让数组变短了
第二个for循环用于覆盖,注意同样更新size,
2. 双指针法 一层for代替二层for
- 快慢指针,快读慢写
- 慢指针负责新数组(的位置),快指针负责旧数组(获得新数组的元素)
- 慢指针何时更新?=>当快指针指向新数组元素时
- 快=>自动更新, 慢=>手动更新
#include <algorithm>
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// ver 1
// int k = nums.size();
// for(int i = 0; i<k;i++){
// if(nums[i]==val){
// for(int j = i+1; j< nums.size();j++){
// nums[j-1]=nums[j];
// }
// i--;
// k--;
// }
// }
// return k;
// ver2
int slow = 0;
int right = 0;
for(right=0;right<nums.size();right++){
if(nums[right]!=val){
nums[slow]=nums[right];
slow++;
}
}
return slow;
}
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:移除