什么是数组?
数组是在内存中连续分布的相同类型数据的集合
数组的特点?
数组下标从0开始。
数组中每个相邻元素在内存中的地址也是相邻的。
数组的元素是不能删除的,只能被覆盖。
二分查找
什么情况下使用这个方法?
在有序的一组数中找一个目标数
二分查找的思想
其实本质是双指针法,在序列中放置一个左,一个右指针,两个指针根据左右指针中间位置的数和目标数之间的大小关系不断变化,中间值大于target,把右指针移动到中间位置,中间值小于target,把左指针移动到中间位置。
二分法程序思路
三个变量,左指针,右指针,mid指针,mid = left + (right - left)/2,这是防止溢出的写法
一个while循环中左右指针不断变化,判断条件是left <= right,注意这里等号意味着左闭右闭,这个区间指的是左右指针在数组中括起来的区间,当区间为左闭右闭的时候,left和right在不断的变化中会有相等的情况,也就是说要在left > right的时候才退出循环,脑子里面想想那个数组和指针图就知道了。
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int mid;
while (left <= right) {
mid = left + (right - left)/2;
if (nums[mid] > target) right = mid - 1;
else if (nums[mid] < target) left = mid + 1;
else return mid;
}
return -1;
}
};
移除元素
移除元素是干嘛的?
移除元素就是把数组中的目标元素都移除并且不破坏数组中其他数的顺序
解决办法:双指针法
双指针法是什么?
双指针法是一个指针在循环中递增,另一个指针根据快指针遇到的情况对其其进行加减和对应的数组元素进行赋值。
代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
int fast = 0;
for ( fast = 0; fast < nums.size(); fast++) {
if (nums[fast] != val ) {
nums[slow++] = nums[fast];
}
}
return slow;
}
};
思路就是快指针在前面走,遇到目标值继续往前,因为需要把不是目标值的数组元素赋值给慢指针对应的数组元素,慢指针元素操作过后马上+1.
最后慢指针的位置就是移除目标值元素之后的数组长度。