leetcode 704 二分查找
题目链接:704、二分查找
今日学习:
文章链接:代码随想录纸质版
视频链接:代码随想录b站视频
第一思路:
二分法原理很简单,利用数组下标(index)其中的middle中间值,每一次与target进行比较,每次比较就可以确定target在左半区间还是右半区间,之后按照这个思路循环下去,以此找到目标值,第一次写的时候确实遇到了视频里面的<=还是<的问题,但是这个想到了,很可惜后面middle-1这个细节还是没发现,而且很笨的把nums.size()和nums[]搞混了。。。
第二思路:看完视频以及书之后,感受到了思路的清晰,明白了左闭右闭和左闭右开的区别,很感谢卡哥的视频分享,解释得很清楚,作为非科班出身的基础比较差,希望能坚持下去。
代码实现:
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 - left) / 2);
if(nums[middle]<target){
left = middle + 1;
}else if(nums[middle]>target){
right = middle - 1;
}else {
return middle;
}
}
return -1;
}
};
以上是左闭右闭的代码实现,而左闭右开要将其中的<=改为<,并且right初始化时应该直接等于nums.size()(此处我的理解是和数组的基础有关系,一般数组后面会跟一个‘/0’,因此多一个元素,而此时右边是开的,因此就正好符合,不知道对不对,后面会纠正,暂且先写着),同时while中right = middle。
感觉自己的代码规范化还要进一步提升。。
至此完成了704的学习,感觉自己还要进一步提升语法基础,弥补自己的不足。
leetcode 27 移除元素
题目链接:27、移除元素
今日学习:
文章链接:代码随想录纸质版
视频链接:代码随想录b站视频
第一思路:
脑子里面第一思路还是暴力解法,这个自己是能想出来的,利用两个循环直接解,第一遍是移除元素,第二遍是更新数组,可惜今天实习太晚,有点来不及了。。。,没有实现这个思路,后面有时间先补上。
第二思路:看完视频以及书之后,双指针法真的简单,感觉会了之后反而比暴力解法要更清晰一些,可以借助图例来了解,效率更高更快。
代码:
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];
}
}
return slow;
}
};
快慢指针就是利用一个快指针先进行一遍数组元素的遍历,在这个过程中,如果目标元素和快指针所指下标的元素不相同,那么快指针将该下标的元素更新到慢指针的位置,慢指针更新完之后,进行++操作,因为要向后移动一位,不然无法更新下一个元素。
(此处nums[slow++] = nums[fast]为先赋值后++)
至此完成了27的学习,语法基础要提升,迫在眉睫,之前学的全忘了。。。