去掉数组最后一个元素_【一天一大 lee】在排序数组中查找元素的第一个和最后一个位置 (难度:中等) Day20201201...
发布日期:2021-06-24 10:02:27 浏览次数:4 分类:技术文章

本文共 2017 字,大约阅读时间需要 6 分钟。

2cea42821bb66e351ec90e9da2efeb60.png
20201201

题目:

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回  [-1, -1]。

进阶:

  • 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

示例:

  1. 示例 1:
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
  1. 示例 2:
输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]
  1. 示例 3:
输入:nums = [], target = 0 输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums  是一个非递减数组
  • -109 <= target <= 109

抛砖引玉

思路:

一遍循环

一遍循环,记录数组中等于 target 元素的位置,如果变量到元素大于 target,则终止循环,直接返回结果

3116c5ef3641c9fa4dfb92f3d3bcecb7.png
抛砖引玉
/**  * @param {number[]} nums  * @param {number} target  * @return {number[]}  */ var searchRange = function(nums, target) {
    let start = -1,         end = -1,         index = 0     while (index         if (nums[index] === target) {
            if (start === -1) {
                start = index                 end = index             } else {
                end = index             }             index++         } else if (nums[index] > target) {
            return [start, end]         } else {
            index++         }     }     return [start, end] }

二分查找

首先二分查找出 target 所在的索引位置:

  • 如果没有找到则返回[-1,-1]
  • 如果找到了索引位置,则在这个索引位置的前后继续查找,找到边界索引位置
var searchRange = function(nums, target) {
    let start = -1,         end = nums.length - 1,         mid = Math.floor((start + end) / 2),         flag = false     // 找到数组中target的位置     while (start <= end) {
        mid = (start + end) / 2         if (nums[mid]             start = mid + 1         } else if (nums[mid] > target) {
            end = mid - 1         } else {
            flag = true             break         }     }     // 找到target边界索引位置     if (flag) {
        let left = mid,             right = mid         while (left - 1 >= 0 && nums[left - 1] == target) {
            left--         }         while (right + 1 <= nums.length - 1 && nums[right + 1] == target) {
            right++         }         return [left, right]     } else {
        return [-1, -1]     } }

博客: 前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言

公众号:前端小书童

转载地址:https://blog.csdn.net/weixin_31990755/article/details/112613877 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:秦九韶算法递推公式_算法讲解之复杂度分析
下一篇:函数传参字典_Python新手上车17:函数传递任意多个参数

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月19日 19时39分48秒