数组
数组最大的特点: 在内存中存储时空间连续。
所以,数组确定好大小后,内存大小不能修改,不能删除元素,只能覆盖。
二分法
题目链接:704二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
int left =0;
int right = nums.size()-1;
while(left<=right){
int middle = (left+right)/2;
if(nums[middle] > target){
right = middle -1;
}
else if(nums[middle] < target){
left = middle+1;
}
else{
return middle;
}
}
return -1;
}
};
思路
- 最重要的是确认搜索区间,左闭右闭or左闭右开,根据搜索区间做后续所有条件的推论。
- while的终止条件,判断是否合法。左闭右闭是 小于等于,因为当左边界和右边界相等时,该区间合法。
- left, right赋值的判断,如果已经判断过了,就应该从接下来的区间中排除。
移除元素27
1暴力解法
int removeElement(vector<int>& nums, int val) {
int size=nums.size();
for (int i=0;i<size;i++){
if(nums[i]==val){
for(int j=i+1;j<size;j++) nums[j-1]=nums[j];
size--;
i--;
}
}
return size;
}
思路
通过两层for循环来实现,每发现一个要移除的元素,就把后面的所有值全部挪前一位。需要注意的是,如果删除了,重新排了序列,就需要对当前位置再次进行判断,不然如果重复出现val,就无法删掉第二次的val,i–存在的意义。
2快慢双指针解法
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;
}
思路
- 想象自己要从原数组中删除掉指定的元素,构建一个新的数组。
- fast指针指向的是新数组的数值,slow指针指的是新数组的index。