因为题目比较简单,在看完题目的时候大致的做题思路就已经在脑中构思出来了,但是我在算法方面属于小白, 所以我的解题思路基本是基于简单编程的暴力算法。但参加训练营的目的是为了学习算法,在学习后采用了新学习的方法来解题,没进行暴力解法的尝试。
704.二分查找
题目链接:力扣
二分法的采用需要满足元素不重复和有序排列,题目可以满足上述要求所一采用二分法进行查找,二分法与我以前玩的游戏猜数(一人随机选取1~100之间的数,然后其余人依次随机猜数字,然后根据前一个人猜的数不断缩小范围直到一个人猜出数字)有些相似,不同之处在于前者固定每次猜的数为中间的数,后者则是不固定每次猜的数,总的来说两者思想一样都是不断压缩范围直到找出需要的数字。
基本思路理解后就是范围的确定,有左闭右闭,和左闭右开,两种方法本质上没有区别,只要掌握好二分法原理就能够理解了。
具体代码:
左闭右闭:
class Solution {
public int search(int[] nums, int target) {
int l=0,r=nums.length-1;
int m;
while(l<=r){
m=(r+l)/2;
if(nums[m]<target)
l=m+1;
else if(nums[m]>target)
r=m-1;
else
return m;
}
return -1;
}
}
左闭右开:
class Solution {
public int search(int[] nums, int target) {
int l=0,r=nums.length;
int m;
while(l<r){
m=l+(r-l)/2;
if(nums[m]<target)
l=m+1;
else if(nums[m]>target)
r=m;
else
return m;
}
return -1;
}
}
27.移除元素
我的理解来说双指针就是用快慢两个指针到达for循环的作用,但与for循环还是有着本质上的区别只是能到达一样的效果。基本思路就是快慢两个指针初始位于0位置上,当快指针遇到不需要移除的元素,将该元素移动到慢指针停留的位置,然后慢指针前进一个元素,快指针则继续向前重复上述步骤直到快指针遍历数组。
具体代码:
class Solution {
public int removeElement(int[] nums, int val) {
int i=0,j=0;
for(;i<nums.length;i++){
if(nums[i]!=val){
nums[j++]=nums[i];
}
}
return j;
}
}
收获与总结
算法训练营第一天的任务完成了,比我想象中要难一点并不是题目难,而是这种学习方式比我想象的难,但好歹是能学会,之后应该也不会有太大问题。今天收获颇丰学会二分法和双指针的用法,还有就是在阅读每日精华的时候发现了一些我不了解的概念kmp算法和字符串哈希,于是就去看了看简单的了解了一下,虽然还达不到能使用的地步但是基本概念和原理还是能够理解,同时也要感叹一下能想出这些算法的是真是远超于我的存在,不知道自己有没有机会能够到达如此程度。
记录
今天是参加训练营第一天老实说我并不是一个勤奋的人,假期的时间我多数都用来打游戏了,在学校也是能逃的课都逃了,但即便是我这样懒惰的家伙也会有自己想要去为之奋斗发目标,为了实现它我逼迫自己坚持,我不确定自己能坚持多久所以我想在接下来的60天记录自己的成长与坚持,也希望在后面我没动力时推自己一把。
打卡第一天!!!