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]                        # 返回结果
  • 相关阅读:
    Unity热更新06-XLua热补丁-05
    Unity热更新06-XLua热补丁-04
    Unity热更新06-XLua热补丁-03
    Unity热更新06-XLua热补丁-02
    Unity热更新06-XLua热补丁-01
    [SQLite][database disk image is malformed]数据库恢复
    VMware 安装MAC
    c#编写的服务中访问网络位置的共享文件夹
    Android Socket发送信息时闪退
    一个简单的Log类
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10676477.html
Copyright © 2011-2022 走看看