首页 > 试题广场 >

在升序数组中查找元素的位置

[编程题]在升序数组中查找元素的位置
  • 热度指数:951 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的非降序排列的整数数组nums,和一个目标值 target。请找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]
该题有的解法


示例1

输入

[4,7,7,8,8,10],8

输出

[3,4]

说明

可以在数组中找到整数8,其开始位置为3,结束位置为4     
示例2

输入

[4,7,7,8,8,10],6

输出

[-1,-1]

说明

不可以在数组中找到整数6,故输出整数-1     
用二分法求数组的左右边界!
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param target int整型 
 * @return int整型一维数组
 */
function searchRange( nums ,  target ) {
//     用二分法寻找左右侧的边界
    let left = findLeftBorder(nums ,  target);
    let right = findRightBorder(nums ,  target);
    return [left, right];
//     获取左侧边界的函数
    function findLeftBorder(nums ,  target) {
        let left = 0, right = nums.length - 1;
        while(left <= right) {
            let mid = Math.floor(left + (right - left)/2);
            if(nums[mid] < target) {
                left = mid + 1;
            } else if(nums[mid] > target) {
                right = mid - 1;
            } else if(nums[mid] === target) {
                right = mid - 1;
            }
        }
        if(left >= nums.length || nums[left] !== target) {
            return -1;
        } else {
            return left
        }
    }
    //     获取右侧边界的函数
    function findRightBorder(nums ,  target) {
        let left = 0, right = nums.length - 1;
        while(left <= right) {
            let mid = Math.floor(left + (right - left)/2);
            if(nums[mid] < target) {
                left = mid + 1;
            } else if(nums[mid] > target) {
                right = mid - 1;
            } else if(nums[mid] === target) {
                left = mid + 1;
            }
        }
        if(right < 0 || nums[right] !== target) {
            return -1;
        } else {
            return right;
        }
    }
}
module.exports = {
    searchRange : searchRange
};


发表于 2022-08-10 17:22:52 回复(0)

问题信息

难度:
1条回答 1153浏览

热门推荐

通过挑战的用户

查看代码