今日任务:
数组理论基础,力扣:704. 二分查找,27. 移除元素
题目链接:
今日学习的文章链接和视频链接
文章连接:代码随想录
看到题目的第一想法
1.704二分查找
数组有序寻找目标值------>考虑二分
左端点为0,右端点为元素个数n;
根据循环不变量,确定更新的区间
mid计算采用:left+(right - left) /2 防止越界
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int mid;
int right = nums.size()-1;
while(left<=right){
mid = left+(right-left)/2;
if(target == nums[mid]) return mid;
if(target > nums[mid]){
//更新左区间
left = mid + 1;
}
else if(target < nums[mid]){
//更新右区间
right = mid - 1;
}
}
//未找到
return -1;
}
};
2.27移除元素
原地移除---->数组元素不能移除,只能覆盖!
返回长度--->使用快慢指针,依靠快指针覆盖慢指针,当快指针走到结尾,慢指针的值就是新数组的长度
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for(int first =0;first<nums.size();first++){
if(nums[first] != val){
nums[slow++] = nums[first];
}else{
continue;
}
}
return slow;
}
};
其他解法:
1.暴力解法:两层for循环,一个遍历数组元素,第二个更新数组 O(N^2)
class Solution {
public:
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];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
}
};
实现过程中遇到哪些困难
快慢指针的移动和边界;
二分查找中,mid的取值需要注意防止越界;
今日收获及学习时长20min
数组理论基础:
1.数组是存放在连续内存空间上的相同类型数据的集合---->下标从0开始;内存空间的地址是连续的----->删除或增加元素时,需要移动其它元素
2.数组的元素是不能删除的,只能覆盖