- 代码随想录算法训练营【60天】
- 总有一件事是要坚持下来的
代码随想录【day 1】| 704. 二分查找、27. 移除元素
LeetCode 704. 二分查找
题目链接:LeetCode704.二分查找
卡哥文解
视频讲解
解题思路
1、区间的定义决定循环停止的条件
左闭右闭[left, right] : while(left <= right)
左闭右开[left, right) : while (left < right)
2、mid取值 int mid = left + ((right - left)/2);(防止溢出)
代码实现
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left<=right){
int mid = left + ((right - left)/2); //注意运算符号的优先级
if(nums[mid]<target){
left = mid +1;
}
else if(nums[mid]>target){
right = mid -1;
}
else return mid;
}
return -1;
}
};
LeetCode 27. 移除元素
题目链接:LeetCode27.移除元素
卡哥文解
视频讲解
解题思路(双指针)
快慢指针
- 快指针遍历整个数组 当数组中快指针所指的元素不等于val 时存入慢指针
- 慢指针指向更新之后的 新数组下标的位置
代码实现
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowindex = 0;
int len = nums.size();
for(int fastindex=0;fastindex<len;fastindex++){
if(nums[fastindex]!=val){
nums[slowindex++] = nums[fastindex];
}
}
return slowindex;
}
};
day1总结复盘
这两道题都是之前做过的 最主要忘记的点在于二分法对于边界的处理
双指针的时间复杂度为O(n) 空间复杂度为O(1)要注意对于循环条件的判断以及快慢指针的定义