二分查找
由于原数组有序,因此每一轮将目标值和数组的中间值进行比较,如果目标值小于中间值,则在左边进行新一轮遍历;反之则在右边。当目标值与中间值相等时,返回mid(即中间值下标),当遍历完成后,如果都没有执行return语句(即没有找到),return -1;
保证每一轮都是左闭右闭或者都是左闭右开。
如果是左闭右闭,则新的一轮遍历是[left,mid-1]或者[mid+1,right],并且初始right值为nums.size()-1;
class Solution {
public:
int search(vector<int>& nums, int target) {
int left, right,mid;
left = 0;
right = nums.size()-1;
while (left<=right)
{
mid = left + right >> 1;
if (nums[mid] == target) return mid;
else if (target > nums[mid]) left = mid + 1;
else right = mid-1;
}
return -1;
}
};
如果是左闭右开,则新的一轮遍历是[left,mid)或者[mid+1,right),并且初始right值为nums.size();
class Solution {
public:
int search(vector<int>& nums, int target) {
int left, right,mid;
left = 0;
right = nums.size();
while (left<right)//由于是左闭右开,因此两个指不能相等,相等的话这个区间在数学上不成立
{
mid = left + right >> 1;//使用位运算符要比/运算快很多
if (nums[mid] == target) return mid;
else if (target > nums[mid]) left = mid + 1;/*由于是左闭右开,因此当目标值在mid右
侧时,将mid+1赋值给left,以保证新的一轮遍历都是mid右侧的值*/
else right = mid;/*由于是左闭右开,当目标值在mid左侧时,将mid赋值给left即可,新一轮
并不会遍历mid下标的值*/
}
return -1;
}
};
移除元素
移除nums中与val相同值的元素。设置快慢指针,快指针j负责遍历整个数组,用于寻找符合条件的元素,慢指针i用于存储该元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i ,j;
for (i = 0, j = 0; j < nums.size(); j++)//i是慢指针,j是快指针,模板中j遍历整个数组
{
if(nums[j]!=val)//快指针j的值如果不等于val,就填入慢指针位置
//while (nums[j] == val) j++;本来想用这个替换if语句直接找到符合条件的快指针下标,但是后面这个语句的nums[j]中的j会越界
nums[i++] = nums[j];
}
return i;
}
};