前置知识:
错误总结:
- 注意要利用好每一个变量,灵活定义变量
- == 和 != 的逻辑要理顺清晰
- ArrayIndexOutOfBoundsException注意遍历的边界
704. 二分查找
题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
思路:
* 定义左右边界
*
* 在循环里判断,目标索引在中间索引的左右哪边 (数组是固定长度的,如果修改数组,需要重新开辟空间;改为修改索引值,有同样的效果)
* if 目标值< 中间索引的值 说明在左边,要更新右边界
* if 目标值< 中间索引的值 说明在右边,要更新左边界
*
* target是目标值,需要返回的是索引号
* 当target = 中间索引的值的时候,return mid (mid就是所需的索引号)
* mid需要动态更新,那么就需要放在循环里
*
* 没有走循环里的return,那么目标值有问题,return -1;
完整代码
public class BinarySearchTest01 {
public static void main(String[] args) {
int[] nums = {-1, 0, 3, 5, 9, 12};
int target = 9;
int result = search(nums,target);
System.out.println(result);
}
public static int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while (left <= right){ //左闭右闭 [1,3,5]
int mid = (left + right)/2;
if (target < nums[mid]){ //if 目标值< 中间索引的值 说明在左边
// 删除中间索引后的值 (数组是固定长度的,如果修改数组的值,需要重新开辟空间;改为修改索引值,有同样的效果)
right = mid - 1;
}else if(target > nums[mid]){
left = mid +1;
}else if(target == nums[mid]){
return mid;
}
}
return -1;
}
}
27. 移除元素
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
完整代码
package DoublePointer;
public class RemoveElement {
public static void main(String[] args) {
/*
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,
而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
*/
int[] nums = {3, 2, 2, 3};
int val = 3;
int result = removeElement(nums, val);
System.out.println(result);
}
public static int removeElement(int[] nums, int val){
/* 输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
思路:
定义双指针
快指针:找到与目标值不相同的值,将其传给慢指针
慢指针:接收快指针的值
遍历数组用于移动快指针
判断快指针的值是否等于目标值
False:将快指针指向的值传给慢指针,慢指针移动一位
True:不操作
慢指针就是要返回的值
*/
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}