题目链接:

Find First and Last Position of Element in Sorted Array

题目的粗心就是给定一个升序的整形数组 nums 和一个指标数字 target ,要求返回一个数组,数组第一项是 target 在 nums 中第一次呈现的下标,第二项是 target 在 nums 最初一次呈现的下标。并且要求工夫复杂度为 O(log n)。

思路

读完题目就能够判断出这道算法题考的查问算法,要求工夫复杂度为 O(log n),间接遍历必定是不行了,因而考查的二分查找算法,刚好工夫复杂度是 O(log n)。

我的思路是先通过二分查找算法,在 nums 中找到任意一个 target 呈现的下标,因为数组是升序的,找到一个下标后,别离向左右找到第一个和 target 不等的地位,就能够找出整个范畴。

解题

实现如下:

/** * @param {number[]} nums * @param {number} target * @return {number[]} */var searchRange = function(nums, target) {    const len = nums.length;    const i = binSearch(nums, 0, len - 1, target);    if (i == -1) {        return [-1, -1]    }    // 找到指标后,前后匹配,找出整个范畴    const ret = [i, i];    let x = i;    while (x >= 0 && nums[x] == target) {        ret[0] = x;        x--;    }    x = i;    while (x < len && nums[x] == target) {        ret[1] = x;        x++;    }    return ret;    };var binSearch = function(nums, start, end, target) {    var mid = Math.floor((start + end) / 2);    while (end >= start) {        if (nums[mid] == target) {            return mid;        }        if (nums[mid] > target) {            end = mid - 1;        } else {            start = mid + 1;        }        mid = Math.floor((start + end) / 2);    }    return -1;}

其中的二分查找办法,咱们能够封装成一个办法,每次题目须要用到的时候,间接复制过去就能够了,很多常见的算法实现,纯熟应用之后都能够这么做。

后果

上面看下后果:

工夫上超过 84% 的提交,还算不错,内存应用算是中等。
一次提交通过后就能够查看其他人的提交,能够比照学习下,盲猜有人用了 js 自带的 indexOf 办法,这个办法的实现效率是比二分查找要快的。

比照

比照了下他人的提交记录,根本都应用了二分查找法,有一种不同的解法,是对二分查找稍作革新,保障每次查到的都是 target 第一次呈现的地位,而后别离找到 target、target + 1 第一次呈现的地位,因为是升序的数组,target + 1 第一次呈现的下标 - 1 就是 target 最初呈现的下标,运行速度比我下面贴的代码要快。

我思考了下,认为应该是当 target 反复次数很多的状况下,通过寻找 target + 1 来确定 target 最初的下标,效率要更快。感兴趣的同学能够深入研究下。

ARTS

题目中的 ARTS 是耗子叔在他的 左耳听风 中发动的个流动:

每周实现一个 ARTS: 至多做一个 LeetCode 的算法题、浏览并点评至多一篇英文技术文章、学习至多一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tip、Share 简称 ARTS)