1、数组理论基础
数组是内存中相同数据类型数据的一种集合
删除数组元素是覆盖操作,不能直接进行删除
2、二分查找
对应力扣上题目704,使用的方法是二分查找法,要注意的使用这种二分法是在有序数组中。
具体先确定所写内容是[left, right]还是[left,right)
拿左闭右闭举个例子:
选择区间为左闭右闭后,while之间的范围就为 left<=right,因为left是可以等于right的。
当确定了选取范围为左闭右闭时,target小于middle时,下一次的左闭右闭区间就是left和middle-1,这时候就要更新right为middle-1。
同理,target大于middle时候,这时候下一次的区间就在middle+1和right之间,这时候更新left为middle+1。
代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {// 使用双指针法
int slowIndex = 0;
for (int fastIndex = 0;fastIndex < nums.size();fastIndex++)// 用快指针遍历整个数组
{
// 快指针等于要找的数,慢指针不变
if(val != nums[fastIndex])// 快指针不等于的要找的数
{
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
};
3、移除元素
对应力扣上第27题,使用的解法是双指针法。
定义两个指针fastIndex,slowIndex,用快指针遍历所有的数组元素,只要快指针的值不等于val的时候,就让慢指针加1,这时候将快指针的值赋给慢指针,这样以来,慢指针得到的所有的值都是没有val的。
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;// 定义左闭右闭的区间[left,right]
while(left <= right)// left最后也可以等于right
{
int middle = left + ((right - left)/2);
if(target < nums[middle])// 目标target在left和middle之间
{
right = middle - 1;
}
else if(target > nums[middle])
{
left = middle + 1;
}
else
{
return middle;
}
}
return -1;
}
};