- 二分查找
题目链接:https://leetcode.cn/problems/binary-search/
方法一:选择区间是左闭右闭区间【left,right】,那么载移动区间的时候就不要重复,所以用 right = middle + 1;
和 left = middle+1;
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 - left)/2;
if(target < nums[middle] ) {
right = middle + 1;
}else if(target > nums[middle]){
left = middle+1;
}else{
return middle;
}
}
return -1;
}
};
方法二:选择区间是左闭右闭区间【left,right),那么载移动区间的时候就不要重复,所以用 right = middle+1;
但是右边取不到,所以可以再下一次循环重复 left = middle;
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)
while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
int middle = left + ((right - left) >> 1);
if (nums[middle] > target) {
right = middle; // target 在左区间,在[left, middle)中
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,在[middle + 1, right)中
} else { // nums[middle] == target
return middle; // 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1;
}
};
- 移除元素
题目链接:https://leetcode.cn/problems/remove-element/
方法一:暴力解法
报错:会越界,因为 j<size的时候,j+1可能会超过,比如j=3时,nums【4】是没有的。
修改:j<size-1
或者如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i=0; i<size; i++){
if(nums[i] == val){
for(int j=i+1; j<size; j++){
nums[j-1] = nums[j];
}
i--;
size--;
}
}
return size;
}
};
方法二:双指针法
快指针:寻找新数组的元素 ,新数组就是被删掉目标元素的剩下的数组
慢指针:更新 新数组下标的位置
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for(int fast=0; fast<nums.size(); fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};