提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Leetcode 704
704 二分查找
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
两个指针,一个指头,一个指尾。然后while循环,mid = (i + j) / 2, 直到 i < j
● 看完代码随想录之后的想法
mid = left + (right - left) / 2 更好
● 自己实现过程中遇到哪些困难
1、应该是while循环,记成了when(),难怪报错
2、应该是 i < = j 的时候进入循环。否则只有一个元素时,不符合循环条件就直接返回 -1了
3、数组的长度是nums.length 没有括号,而且想要得到最后一个标号要 length - 1
● 今日收获,记录一下自己的学习时长
简单类型 思路清楚,但是细节上错太多,要多练。
public int search(int[] nums, int target) {
int i = 0;
int j = nums.length - 1;
int mid;
while(i<=j){
mid= (i+j)/2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] < target){
i++;
}else{
j--;
}
}
return -1;
}
27 移除元素
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
想用right指向数组最后一个元素,然后当left是时,交换left的值到right位置
但是,需要一直保持right所指向的值不是value。不仅开始时要不是,在交换后,right向前移动时,仍然不能是。还要保证right和left的大小关系,超出下标0时怎么办。
判断条件琐碎,且易错。
● 看完代码随想录之后的想法
快慢指针
永远能保持 left 以左的值属于数组,这样要求数组长度时,很方便。
当right结束时,此时 left 如果不是,直接返回left左边的个数,即left的值,也是数组个数
如果 left 是,right指向它时,已经保存到了前边,依然是left左边的个数
这个过程从左到右,可以不用一直判断是否超过数组下标的条件
● 自己实现过程中遇到哪些困难
1、返回的就是left左边的个数,length = left;
2、for循环,当right值不是时,赋值给left。并且right增加是因为for循环。而left值增加是满足条件才+1;
● 今日收获,记录一下自己的学习时长
双指针很好用,应该记住。学习时长忘记了。
public int removeElement(int[] nums, int val) {
int left = 0;
int right ;
int len = nums.length;
for(right=0;right < len;right++){
if(nums[right] != val){
nums[left] = nums[right];
left++;
}
}
return left ;
}