代码随想录第一天 -- LeetCode704 二分查找、27 移除元素

本文介绍了使用二分查找算法解决LeetCode问题704,以及如何在数组中移除特定元素的双指针方法。重点讲解了边界条件处理和代码实现细节。
摘要由CSDN通过智能技术生成

前置知识:

数据结构:数组
算法:二分法双指针

错误总结:

  1. 注意要利用好每一个变量,灵活定义变量
  2. == 和 != 的逻辑要理顺清晰
  3. 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值