① 数组理论基础

文章提供了两种LeetCode问题的解决方案,一是使用二分查找法在有序数组中搜索目标值,二是通过快慢指针法移除数组中的特定元素。二分查找中特别考虑了目标值不在数组内的处理,移除元素则展示了两种方法,一种是快慢指针法,另一种是暴力破解法。

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

704. 二分查找

原题链接:https://leetcode.cn/problems/binary-search/

注意点:

目标值不在数组内:直接返回-1

循环终止条件:第一个值的下标小于等于最后一个值的下标

题解:

class Solution {
    public int search(int[] nums, int target) {
        // 左闭右闭法
        int start =  0;
        int end = nums.length-1;

        // 提前判断target小于最小值或大于最大值
        if (target<nums[0] || target > nums[nums.length-1]){
            return -1;
        }

        while (start <= end){
            int mid = (start+end)/2;
            if(nums[mid] > target){
                end = mid-1;  // 如果target比第一个数还小,end=-1  < start=0,退出循环返回-1
            }else if (nums[mid] < target){
                start =  mid+1;  // 如果target比最后一个数还大,start>end,退出循环返回-1
            }else {
                return mid;
            }
        }
        return -1;
    }
}

27. 移除元素

原题链接:https://leetcode.cn/problems/remove-element/

注意点:

快指针和慢指针分别表示什么?

题解:

class Solution {
    //快慢指针法
    public int removeElement(int[] nums, int val) {
        // 快指针用来获取新数组中的元素
        // 慢指针是获取新数组中需要更新的位置  (可以想象慢指针指向一个虚空数组)
        int slowIndex = 0;
        for (int fastIndex=0;fastIndex<nums.length;fastIndex++){
            if (val != nums[fastIndex]){    // 留下需要的元素
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
    // 暴力破解法
    public int removeElement(int[] nums, int val) {
        int len = nums.length;
        for (int i=0;i<len;i++){
            if (val == nums[i]){  // 发现需要移除的元素时,将数组集体向前移动一位
                for (int j=i+1;j<len;j++){
                    nums[j-1] = nums[j];   // 这样写的目的是避免下标越界
                }
                i--;  // 因为当前的元素被删除了,再次循环时i+1,会跳过被删除元素的后面一位数
                len--;  // 长度-1
            }
        }
        return len;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值