leetcode34 找排序数组中找元素的第一个和最后一个位置(二分变形:存在重复元素)

该代码实现了一个在非递减有序数组中查找给定目标值起始和结束位置的算法。使用了二分查找法,时间复杂度为O(logn)。如果找不到目标值,返回[-1,-1]。示例输入nums=[5,7,7,8,8,10],target=8,输出为[3,4]。
摘要由CSDN通过智能技术生成

题目:
Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.

If target is not found in the array, return [-1, -1].

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */

//let arr = []; //创建一个空数组
//let arr2 = [1, 2, 3]; //创建一个有三个元素的数组

//let arr = new Array(); //创建一个空数组
//let arr2 = new Array(1, 2, 3); //创建一个有三个元素的数组

var searchRange = function(nums, target) {
    //先new一个数组保存第一个or最后一个,用作返回
   let answer = [];
    answer[0]=findFirst(nums,target);
    answer[1]=findLast(nums,target);
    return answer;

    function findFirst(nums,target){
        let left=0;
        let right=nums.length-1;
        while(left<=right){
            let mid=Math.floor(left+(right-left)/2);
            if(nums[mid]>target){
                right=mid-1;
            }
            else if(nums[mid]<target){
                left=mid+1;
            }
            else {     //这里等于target的值已经找到了,判断是不是第一个;
                //因为是升序数组,所以它前面一个不一样,即为第一个
                //要判断临界值!! 比如第一个最后一个当然是第一个值和最后一个值;
                if(mid==0 || nums[mid-1] != target){
                return mid;
                }
                else{
                    right=mid-1;
                }
            }
        }
        return -1;   //!! 根据题意 别忘记没有就返回-1 !!;
    }


    function findLast(nums,target){
        let left=0;
        let right=nums.length-1;
        while(left<=right){
            let mid=Math.floor(left+(right-left)/2);
            if(nums[mid]>target){
                right=mid-1;
            }
            else if(nums[mid]<target){
                left=mid+1;
            }
            else {     //这里等于target的值已经找到了,判断是不是第一个;
                //因为是升序数组,所以它前面一个不一样,即为第一个
                //要判断临界值!! 比如第一个最后一个当然是第一个值和最后一个值;
                if(mid==nums.length-1 || nums[mid+1] != target){
                return mid;
                }
                else{
                    left=mid+1;
                }
            }
        }
        return -1;
    }


};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值