写法一:左右区间可以相等,left = right(左右区间的值都可以取到,这是更新left和right的依据)
cpp
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(nums[middle]>target){
right = middle - 1;
}
else if(nums[middle]<target)
{
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
};
写法二:左右区间不能相等,即为left<right
cpp
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();//因为right的边界值是不可取的,所有不要减一
while(left<right){
int middle = left + (right - left)/2;
if(nums[middle]>target){
right = middle;//此时middle为不可取的边界值,故middle因从为middle开始
}
else if(nums[middle]<target)
{
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
};
27.移除元素
写法一:暴力解法
cpp
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;
}
};
写法二:双指针法,快慢指针
注释:快慢指针,实质上是一个数组的自我复制,只不过里面有一些数据是不合格的,所有需要进行删除更新,而这时候,快慢指针的两者不同的作用就展示出来了,数组整体被分割为俩个部分
一为下标,二为数据,下标由slowIndex控制,数据由fastIndex控制,二者俩结合就形成了一个符合题意的新数组
cpp
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
int size = nums.size();
for(int fastIndex = 0;fastIndex<size;fastIndex++){
if(nums[fastIndex]!=val){
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};