zoukankan      html  css  js  c++  java
  • 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)

    Given an array of integers nums sorted in ascending order, find the starting and ending position of a given targetvalue.Your algorithm's runtime complexity must be in the order of O(log n).

    If the target is not found in the array, return [-1, -1].

    Example 1:         Input: nums = [5,7,7,8,8,10],         target = 8                          Output: [3,4]

    Example 2:           Input: nums = [5,7,7,8,8,10],       target = 6                          Output: [-1,-1]

    思路


            这道题最简单的思路就是一个从头开始遍历查找找到指定元素终止,一个从尾部开始查找直到指定元素终止。然后返回两个下标即为结果。时间复杂度为O(n),空间复杂度为O(1)。

      第二种思路是我们运用我之前写的二分查找那篇博客中第一个经典问题就是查找有序数组中指定元素第一个出现的位置,找到之后然后向后遍历找到最后一个出现的位置,然后返回结果。时间复杂度为O(log n), 空间复杂度为O(1)。

    第一种思路图示


    第二种思路图示


    第二种思路实现代码


     1 class Solution(object):
     2     def searchRange(self, nums, target):
     3         if len(nums) < 1:
     4             return [-1, -1]
     5         start, end = 0, len(nums)-1
     6         mid = 0
     7         while start <= end:             # 二分查找
     8             mid = start+((end- start)>>1)  # 取中间值
     9             if nums[mid] < target:      
    10                 start = mid+1
    11             elif nums[mid] > target:
    12                 end = mid-1
    13             else:               # 当找到target值时,我们在进行查找,找到第一个出现的位置
    14                 if mid == 0 or nums[mid-1] != target:   
    15                     break
    16                 end = mid-1
    17         if nums[mid] != target:      # 没找到,直接返回结果
    18             return [-1, -1]
    19         tem = mid
    20         while tem < len(nums)-1 and nums[tem+1] == nums[tem]:  # 找到最后出现的下标
    21             tem += 1
    22         return [mid, tem]          返回下标

    第一种思路实现代码


     1 class Solution:
     2     def searchRange(self, nums, target):
     3         """
     4         :type nums: List[int]
     5         :type target: int
     6         :rtype: List[int]
     7         """
     8         start, end = -1, -1
     9         for i in range(len(nums)):     # 从头开始遍历
    10             if nums[i] == target:       # 找到下标
    11                 start = i
    12                 break
    13                 
    14         if start < 0:                 # 没找到直接返回结果
    15             return [-1, -1]
    16         
    17         for i in reversed(range(len(nums))):     #从尾部向前开始查找
    18             if nums[i] == target:
    19                 end = i
    20                 break
    21         return [start, end]                        # 返回结果
  • 相关阅读:
    springmvc上传下载
    在线剪切
    Spring入门
    登录验证后端添加过滤器
    SpringMVC入门
    ScriptManager 以及ScriptManagerProxy在母版中使用和Service属性的使用
    GridView中如何使用CommandField删除时,弹出确认框?
    C# 测量用指定的 Font 绘制的指定字符串。(指定字符串的像素长度)
    ASP.NET AJAX 简单地过一下每个控件(ScriptManager、ScriptManagerProxy、UpdatePanel、 UpdateProgress和Timer)
    XML结构和数据导入到SQL server
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10676477.html
Copyright © 2011-2022 走看看