在数组中查找元素第一个与最后一个的位置

这篇博客主要介绍了两种使用双指针技术在数组中寻找目标值搜索范围的方法。第一种适用于无序数组,采用递归的方式,分别从左右两端查找目标值的首次出现和最后出现位置。第二种针对有序数组,通过一次遍历找到目标值的边界。这两种方法都是在LeetCode上的题目,分别是无序数组的搜索范围问题和有序数组的查找范围问题。
摘要由CSDN通过智能技术生成

1.当数组无序时:

双指针+递归

class Solution {
    public int[] searchRange(int[] nums, int target) {
           //空数组,直接返回
        if(nums.length == 0)
        {
            return new int[]{-1,-1};
        }
        //初始左指针,指向第一个元素
        int left = 0;
        //初试右指针,指向最后一个元素
        int right = nums.length-1;
        //所在的位置 ans[0]:第一次出现的位置 ans[1]:最后一次出现的位置
        int[] ans = new int[2];
        //查找方法
        search(nums,left,right,target,ans);
        return ans;
    }
        /**
        *@param arr 进行查找的数组
        *@param left 左指针
        *@param right 右指针
        *@param target 目标数字
        *@param ans  存放结果的数组
        */

    void search(int[] arr,int left,int right,int target,int[] ans)
    {
        
        if(left <= right)
        {
            if(arr[left] != target)
            {
               //若没有找到,则向右移动
                search(arr,left+1,right,target,ans);
            }else
            {
                ans[0] = left;
            }
            if(arr[right] != target)
            {
               //若没有找到,则向左移动
              search(arr,left,right-1,target,ans);
            }else{
                ans[1] = right;
            }
        }else{
            //数组中不存在目标值,返回[-1,-1]
            ans[0]= -1;
            ans[1]=-1;
        }
    }
}
返回该题
力扣 LeetCode

2.数组递增时——对应力扣34

双指针遍历

class Solution {
    public int[] searchRange(int[] nums, int target) {
        if(nums.length == 0)
        {
            return new int[]{-1,-1};
        }
        int left = 0;
        int right = nums.length-1;
        int[] ans = new int[2];
        while(left <= right)
        {
            if(nums[left] < target)
            {
                left++;
            }else
            {
                    ans[0] = left;
                    break;
            }
        }
        while(left <=right)
        {
            if(nums[right] > target)
            {
                right--;
            }else{
                ans[1] = right;
                break;
            }
        }
        if(nums[ans[0]] != target)
        {
            return new int[]{-1,-1};
        }
        return ans;
    }
}

结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值