理论基础
1、数组是存放在连续内存空间上的相同类型数据的集合
2、数组可以方便的通过下标索引的方式获取到下标下对应的数据
3、数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址
1-704二分查找
1.2第一想法
采用二分法,之前学到过,要考虑区间的左右封闭
1.3代码实现
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开
int left=0;
int right = nums.size();
while(left < right){
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;
}
};
思路:
当中间值>目标值时,替换右边的right(middle):因为右边是开区间,不用middle;
当中间值<目标值时,替换左边的right(middle+1)
感想
后续可以考虑使用左闭右闭式,
此时当中间值>目标值时,替换右边的right(middle-1);
当中间值<目标值时,替换左边的right(middle+1)
2-27移除元素
2.2第一想法
采用暴力解法,但并不是最简方法;
看了视频讲解后—— 引入双指针,快:寻找新数组元素; 慢:更新数组下标
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖
2.3代码实现
//双指针解法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow =0;
for(int fast =0;fast<nums.size();fast++){
if(val != nums[fast]){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
感想
根据本题目引出了双指针的方法,再后续的题目中也能看到此方法的妙用。