代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素

文章介绍了如何使用二分查找解决LeetCode704问题,强调了边界条件处理和递归逻辑。另外,针对LeetCode27题,提出了使用双指针策略移除元素,特别提到了处理数组边界情况的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 LeetCode 704.二分查找

题目链接:704.二分查找

思路:题目直接指定了查找的方式是“二分查找”,那么就直接使用二分查找解决问题即可。

代码:

class Solution {
    public int search(int[] nums, int target) {
        if (nums.length == 0) {
            return - 1;
        }
        return search(nums, target, 0, nums.length);
    }

    public int search(int[] nums, int target, int start, int end) {
        if (start >= end) {
            return -1;
        }

        int mid = start + (end - start) / 2;
        int index;
        if (target < nums[mid]) {
            index = search(nums, target, start, mid);
        } else if (target > nums[mid]) {
            index = search(nums, target, mid + 1, end);
        } else {
            index = mid;
        }

        return index;
    }
}

遇到的困难:实现的过程比较直接,首先定义递归函数的参数和返回值;然后定义递归函数的出口条件;最后实现单层递归逻辑。主要是对于边界情况的把握和对于“左闭右开”原则的使用。

 LeetCode 27.移除元素

题目链接:27.移除元素

思路:

(1)直接删除,但是满足不了只能使用O(1)的额外空间的题目要求。

(2)使用双指针,交换目标元素与其他元素的位置,放到数组的末尾。

代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            if (nums[left] != val) {
                left++;
                continue;
            }
            if (nums[right] == val) {
                right--;
                continue;
            }
            swap(nums, left, right);
        }

        return left;
    }

    public void swap(int[] nums, int left, int right) {
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
    }
}

遇到的困难:实现的时候while条件里面写的是`left < right`,这样就导致没有覆盖到一个边界case,当数组中只有一个元素,同时val不在数组中,这个时候left不会更新,导致返回的left为0,leetcode检查结果的时候就会判错。

正确的做法是,`while (left <= right)`,这样就可以在只有一个元素的基础上也能都移动left。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值