代码随想录算法训练营第一天|704. 二分查找,27. 移除元素
题目链接: 704.二分查找
看到题目的第一想法:
就像看到题目的title一样,想到了用二分法。二分法定义左右指针,然后根据左右指针确定中间指针,其次利用中间指针指向的值比较目标值,然后不断缩小左右指针的区间,最后找到该值。
注意:区间一定要自己定义好,不然很容易弄混,我再做题时,是根据题目给的例子,然后自己一步步演算写的代码。
package com.second.day1;
public class Search_704 {
/**
* 二分法
* @param nums
* @param target
* @return
*/
public int search(int[] nums, int target) {
//左闭右开
int left = 0;
int right = nums.length;
while(left < right) {
//防止mid在整数范围内溢出,求中值可以用这种方法
int mid = left + (right - left) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target) {
left = mid + 1;
}
else {
right = mid;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = new int[]{-1, 0, 3, 5, 9, 12};
Search_704 demo = new Search_704();
System.out.println(demo.search(nums, 9));
}
}
看完代码随想录之后的想法
本题是二分法的简单题,为什么说简单题呢?因为它完全符合使用二分法的条件(数组有序且数组中无重复元素)。卡哥要我明白了做二分法时一定要注意区间的定义,区间的定义就是不变量。
自己实现过程中遇到哪些困难
可能是二刷的原因,这道题的思路没问题,只是在写代码的时候(nums[mid]<target)被我写成了(mid < target),之后debug了一下,就AC了。
题目链接 27. 移除元素
看到题目的第一想法:
看到题目后想到了用双指针,其中一个指针遍历当前数组,另外一个指针来控制符合题目要求的数,具体来说,指针i遍历当前数组,如果nums[i]==val也就是要移除该元素,不做任何操作,指针i继续遍历数组,否则不需要移除当前i指向的数组值,把当前指针i下的值赋值给index指针,然后index指针往后移,i 继续遍历数组。
package com.second.day1;
public class RemoveElement_27 {
/**
* 双指针法
* @param nums
* @param val
* @return
*/
public int removeElement(int[] nums, int val) {
int index = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == val) {
continue;
}
nums[index] = nums[i];
index++;
}
return index - 1;
}
}
看完代码随想录之后的想法:
卡哥在描述思路的时候比我说的好,说的就是快慢指针,容易理解且专业。
自己实现过程中遇到哪些困难:
没遇到问题,哈哈哈哈。
今日收获,记录一下自己的学习时长:
今天写了三个题:
55. 跳跃游戏(贪心算法),27. 移除元素,704. 二分查找
代码:1h
博客:40min
好久没写过博客了,虽然没人看,继续坚持下去吧。