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

来源:3-8 在滑动窗口中做记录 Longest Substring Without Repeating Characters

慕粉3884565

2020-08-27

http://img.mukewang.com/szimg/5f47c40b09ba209d07350433.jpg


就是下面是我的代码,我写的有问题

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    while (left < right) {
        let middle = parseInt((left + right) / 2)
        if (target > nums[middle]) {
            left = middle + 1
        } else if (target == nums[middle]) {
            let num = nums[middle]
            let last = middle
            if(right-left==0){
                return [0,0]
            }
            for (let j = middle; j < right; j++) {
                if (num == nums[j]) {
                    last = j;
                }
            }
            return [left, last]
        } else {
            right = middle - 1
        }
    }
    return [-1, -1]
};

http://img.mukewang.com/szimg/5f47c458095ecd7907940505.jpg

感觉是自己代码有问题恳请老师指导

写回答

1回答

liuyubobobo

2020-08-29

你的 while 循环的条件是错的,要想确定一个元素,应该是 while(left <= right),请再看一下这个课程的 3-1 和 3-2。


但是修改完这一点,你的程序依然是错的。关键在于中间 else if (target == nums[middle]) 中间找左右边界是错误的。Leetcode 会给出错误的 case,实际用这个 case 去调试一下,看看自己的代码为什么得到了错误的结果?


另外,你的这个思路,其实是 O(n) 级别的算法。因为中间 else if (target == nums[middle]) 部分的逻辑是线性的。这个问题可以在 O(logn) 的时间里解决。你需要使用二分查找法,找到 >= 某个元素的最小值,就是左边界;找到 > 某个元素的最小值,这个最小值左边的元素,就是右边界。


对此,Leetcode 上这个专题应该有介绍:https://leetcode-cn.com/leetbook/detail/binary-search/,可以参考。


继续加油!:)

0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7441 学习 · 1159 问题

查看课程