704 二分查找
链接:https://leetcode.cn/problems/binary-search/description/
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:二分
- 三个判断
- 当==target时,寻找到关键元素
- middle处元素小于target,则目标元素在右区间,则left=middle+1
- middle处元素大于target,则目标元素在左区间,则right=middle-1
- 关键点:左闭右闭
- while判断(<=)
理解:left=right时存在一个元素,需要进入while循环 - left与right与middle的关系(left=middle+1,right=middle-1)
- 补充:存在左闭右开的解法,但是怕混淆,不详细描述,仅需记住一个就好
- while判断(<=)
// c++实现
class Solution {
public:
int search(vector<int>& nums, int target) {
int middle=-1;
int left=0;
int right=nums.size()-1;
while(left<=right){//左闭右闭,left=right时存在一个元素
middle=(left+right)/2;
if(nums[middle]==target){
return middle;
}
else if(nums[middle]>target){
right=middle-1;
}
else{
left=middle+1;
}
}
return -1;
}
};
27 移除元素
链接:https://leetcode.cn/problems/remove-element/description/
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路:双指针
- 关键点
- i:右指针,一个一个元素去判断
- index:左指针,记录当前是否需要放入的元素位置
- 反向思维:保留不需要删掉的元素即覆盖掉需要删掉的元素
c++实现:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int index=0;
for(int i=0;i<nums.size();i++){
if(nums[i]!=val){
nums[index]=nums[i];
index++;
}
}
return index;
}
};