数组基础
- 数组是存放在连续内存空间上的相同类型数据的集合。
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
- 数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
- 如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
- 数组的元素是不能删的,只能覆盖。
- 在C++中二维数组在地址空间上是连续的;Java不是
704:二分查找
题目链接:704:二分查找
题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
// 左闭右闭
int left=0,right=nums.size()-1;//这里我一开始写成sizeof(nums)
while(left<=right){//这里我觉得[1,1]这个例子挺好的
int middle=left+((right-left)/2);//防止溢出,等价于(left+right)/2
if(nums[middle]>target){
right=middle-1;//这里我其实挺好理解的,高中数学感觉
}else if(nums[middle]<target){
left=middle+1;
}else return middle;
}
return -1;
}
};
左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
// 左闭右开
int left=0,right=nums.size();//这里因为右边是开区间
while(left<right){//同样举例[1,1)
int middle=left+((right-left)/2);
if(nums[middle]>target){
right=middle;//右开
}else if(nums[middle]<target){
left=middle+1;//左闭
}else return middle;
}
return -1;
}
};
27.移除元素
题目链接:27.移除元素
要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
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];
}
}
return slow;//此时slow指针的index即新数组元素个数
}
};