算法学习Day1-二分查找和移除数据(代码随想录)
二分查找:
今日学习的文章:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#_704-%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE
题目:LeetCode704
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVMHD7CS-1676472268210)(C:\Users\47873\AppData\Roaming\Typora\typora-user-images\image-20230215223156411.png)]
看到该题目,题目写的很明显是二分查找,也是想了一下就写出来代码,但是运行完发现错误,然后调试了一下,改了一下代码就成功了。
但是在看了代码随想录之后发现了一个问题,其中提到了左闭右闭和左闭右开两种思路,而我对此一无所知,在看完文章之后,我依旧思路不太清晰,更加混乱了,又去看了代码随想录的相关的二分查找的视频:https://www.bilibili.com/video/BV1fA4y1o715
看完视频后思路清晰了一些,最后通过总结,更加清晰了一些,但是在我写完题目之后,发现不必去纠结这些,我就当成只有一种,将另一种做个了解,只把左闭右闭当作自己主要运用的方法即可。
本人思路如下所示:
class Solution {
public int search(int[] nums, int target) {
int high=nums.length;
int low=0;
int temp=0;
while (nums[temp]!=target){
temp=(low+high)/2;
if(nums[temp]>target){
high=temp;
}
else if(nums[temp]<target){
low=temp+1;
}
if((high-low)<1){return -1;}
}
return temp;
}
}
移除元素
学习的文章:
https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html#%E6%80%9D%E8%B7%AF
题目:LeetCode 27
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-64UhRGvo-1676472268211)(C:\Users\47873\AppData\Roaming\Typora\typora-user-images\image-20230215205249066.png)]
看到该题目,第一想法就是创建两个指针,然后边交换数据边往中间移动,知道两个指针相遇,想法比较地简单,感觉也可行
在看完代码随想录之后,看到有一个暴力算法,不是特别感兴趣,而是有一个快慢指针的方法挺有意思,这也是一种思路,在我一开始写双向指针遇到挫折的时候这中算法也许更有效率
是将在数组头部就创建两个指针,然后一步步像后移动的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cf9ZIt2-1676472268212)(C:\Users\47873\AppData\Roaming\Typora\typora-user-images\image-20230215214442476.png)]
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0,fast=0;
int t=0;
if(nums.length==0)return 0;
for(;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
continue;
}
}
return slow;
}
}
但是更为有效率的做法还是下列的双头的指针的做法
class Remove {
public int removeElement(int[] nums,int val){
int x=0,y=nums.length;
if(nums.length==0)return 0;
for(;x<y;){
if(nums[x]==val){
nums[x]=nums[y-1];
y--;
continue;
}
x++;
}
return y;
}
}
这两种方法我在实现的时候都碰到了一定的困难,虽然在实现过后看起来是很简单的,但是在实现的时候主要是在碰到只有一两个数的数组时碰到了困难,是在运用循环的时候对for、do…while循环的时候不是特别熟悉,特别是for循环条件中的最后一个分号条件的选择,是放在代码中还是放在括号中所呈现的效果是不一样的。
学习总结
组时碰到了困难,是在运用循环的时候对for、do…while循环的时候不是特别熟悉,特别是for循环条件中的最后一个分号条件的选择,是放在代码中还是放在括号中所呈现的效果是不一样的。
学习总结
通过今天的算法学习,主要是开始找到做题的感觉,这是一个挺好的开始,今天的内容中,移除元素的内容掌握的比较好,个人倒是觉得二分法的细节处理解不是很到位,需要做做别的练习题再巩固一下。