在排序数组中查找元素的第一个和最后一个位置
来源:3-8 在滑动窗口中做记录 Longest Substring Without Repeating Characters

慕粉3884565
2020-08-27
就是下面是我的代码,我写的有问题
/** * @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] };
感觉是自己代码有问题恳请老师指导
写回答
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/,可以参考。
继续加油!:)
00
相似问题