Leetcode题库——34.在排序数组中国查找元素的第一个和最后一个位置
@author: ZZQ
@software: PyCharm
@file: searchRange.py
@time: 2018/11/12 19:19
要求:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
思路:1. 二分查找,先找到该元素的位置,然后向前向后搜索其起止位置(好像会到O(n))
2. 分两次搜索,二分查找,先找到起始位置,再找到停止位置。
class Solution():
    def __init__(self):
        pass
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        nums_len = len(nums)
        start_index = -1
        end_index = -1
        if nums_len == 0:
            return [start_index, end_index]
        elif nums_len == 1:
            if nums[0] == target:
                return [0, 0]
            else:
                return [start_index, end_index]
        else:
            left = 0
            right = nums_len-1
            while left <= right:
                middle = (left + right) / 2
                if nums[middle] == target:
                    start_index = middle
                    while nums[middle] == target:
                        middle += 1
                        if middle == nums_len:
                            end_index = middle - 1
                            break
                    if end_index == -1:
                        end_index = middle - 1
                    while nums[start_index-1] == target:
                        start_index -= 1
                        if start_index < 0:
                            start_index += 1
                            break
                    return [start_index, end_index]
                elif nums[middle] < target:
                    left = middle + 1
                else:
                    right = middle - 1
            return [start_index, end_index]
    def searchRange2(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        nums_len = len(nums)
        start_index = -1
        end_index = -1
        if nums_len == 0:
            return [start_index, end_index]
        elif nums_len == 1:
            if nums[0] == target:
                return [0, 0]
            else:
                return [start_index, end_index]
        else:
            left = 0
            right = nums_len-1
            min = nums_len-1
            max = 0
            while left <= right:
                middle = (left + right) / 2
                if nums[middle] == target:
                    if middle < min:
                        min = middle
                    if middle > max:
                        max = middle
                    right -= 1
                elif nums[middle] < target:
                    left = middle + 1
                else:
                    right = middle - 1
            left = 0
            right = nums_len - 1
            while left <= right:
                middle = (left + right) / 2
                if nums[middle] == target:
                    if middle < min:
                        min = middle
                    if middle > max:
                        max = middle
                    left += 1
                elif nums[middle] < target:
                    left = middle + 1
                else:
                    right = middle - 1
            if min > max:
                return [-1, -1]
            else:
                return [min, max]
												
											Leetcode题库——34.在排序数组中国查找元素的第一个和最后一个位置的更多相关文章
- 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
		
34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...
 - Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
		
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
 - Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)
		
题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...
 - LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]
		
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
 - #leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置
		
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log n) 级别.如果数组中不存在目标值,返回 [-1 ...
 - leetcode 34在排序数组中查找元素的第一个和最后一个位置
		
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { ve ...
 - 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
		
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
 - 【LeetCode】34-在排序数组中查找元素的第一个和最后一个位置
		
题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...
 - [Swift]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 | 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 ...
 
随机推荐
- iOS在framework中使用CoreData出现崩溃问题及解决方法
			
公司项目中有一个功能,保存授权令牌数据.最开始只有一条数据,所以就直接保存在了userdefaults中.后来需要两条数据,还是保存在userdefaults中,其中一条为固定的,另一条不固定可以进行 ...
 - 笔记2:MYSQL 表操作
			
一.表约束 1.非空约束:not null 作用:定义表的某一列不能为空. >> alter table 表名 modify 列名 int not null; "添加非空约束&q ...
 - Linux-2.6驱动程序分层分离概念
			
下面以一个按键的实验作为驱动分离时间简单学习: #include <linux/module.h> #include <linux/version.h> #include &l ...
 - Scrapy-从数据库取出IP并判断是否可用
			
import pymysql import requests conn = pymysql.connect(host="localhost",user="root&quo ...
 - 5.Control flow statements-流程控制(Dart中文文档)
			
你可以使用如下流程控制符: if and else for loops while and do-while loops break and continue switch and case asse ...
 - oracle中查找锁定状态的用户
			
SQL> desc dba_users;desc dba_users; 名前 NULL? 型 ----------------------------------------- -------- ...
 - 苏州Uber优步司机奖励政策(4月24日)
			
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
 - 9 stark组件 增删改
			
1.效果图 2.详细步骤解析 1.构造增删改查url,反向解析 2.ModelForm定制add.edit页面 3.staradmin中的ModelForm 3.总结.代码 1.知识点 1.解决代码重 ...
 - springboot之jar运行脚本
			
一.现在的工程都将就独立和简单了,我们在使用springboot做开发或者其他框架做开发时,在linux上面执行的时候.总会写一下脚本,目的当然是为了更加好的运行程序.不然每次都手动输入一下命令,来调 ...
 - bzoj 前100题计划
			
bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...