Leetcode 34 Find First and Last Position of Element in Sorted Array 解题思路 (python)
本人编程小白,如果有写的不对、或者能更完善的地方请个位批评指正!
这个是leetcode的第34题,这道题的tag是数组,需要用到二分搜索法来解答
34. 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 target value.
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 = 8Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6Output: [-1,-1]
这道题目的难点在于O(log n),看到了O(log n)想到的基本就是二分搜索法,但怎么实现呢?大致有以下两种思路:
方法一:
思路:
先做一遍二分搜索,如果不能找到target的话返回(-1,-1)如果能找到的话然后向左、向右搜索进而找到最小和最大的target,返回index
这种解法的时间复杂度平均是O(log(n)),但当所有在数组中的数字都是一样的并且也都等于target的时候最差是O(n)
Python 代码实现:
class Solution:
def searchRange(self, A, target):
left = 0; right = len(A) - 1
while left <= right:
mid = (left + right) // 2
if A[mid] > target:
right = mid - 1
elif A[mid] < target:
left = mid + 1
else:
list = [0, 0]
if A[left] == target:
list[0] = left
if A[right] == target:
list[1] = right
for i in range(mid, right+1):
if A[i] != target:
list[1] = i - 1; break
for i in range(mid, left-1, -1):
if A[i] != target:
list[0] = i + 1; break
return list
return [-1, -1]
方法二:
思路:
做两遍二分搜索,如果不能找到target的话返回(-1,-1)如果能找到的话第一遍返回最小的index,第二遍返回最大的index,这样的话可以保证在最差的情况下时间复杂度是O(log(n))。
那么这两种二分法的搜索到底怎么实现呢?具体方法见参考文献【1】里面的2.1和2.2。
即我们希望实现找到第一个与target相等的元素和最后一个与target相等的元素:
(1)找到第一个与target相等的元素,如果没有的话返回-1:
def search_first_target(self, nums, target):
left,right = 0,len(nums)-1
while (left <= right):
mid = (left + right) >> 1
if (nums[mid] >= target): # 注意1
right = mid - 1
else:
left = mid + 1
if nums[left] == target:
return left # 注意2
else:
return -1
(2)找到最后一个与target相等的元素,如果没有的话返回-1:
def search_last_target(self, nums, target):
left,right = 0,len(nums)-1
while (left <= right):
mid = (left + right) >> 1
if (nums[mid] > target): # 注意1
right = mid - 1
else:
left = mid + 1
if nums[right] == target:
return right # 注意2
else:
return -1
最后的实现只是需要把以上两段代码合并到一起即可:
时间复杂度:log(n)
Python 代码实现:
class Solution(object):
def searchRange(self, nums, target):
l,r = 0, len(nums)-1
left,right = -1,-1
result_left, result_right = -1, -1
while(l <= r):
mid = r+(l-r)//2
if (nums[mid] > target):
r = mid - 1
elif (nums[mid] < target):
l = mid + 1
elif (nums[mid] == target):
r = mid - 1
result_left = nums[mid]
if result_left == target:
left = l
else:
return -1,-1
l,r = 0, len(nums)-1
while(l <= r):
mid = r+(l-r)//2
if (nums[mid] > target):
r = mid - 1
elif(nums[mid] < target):
l = mid + 1
elif(nums[mid] == target):
l = mid + 1
result_right = nums[mid]
if result_right == target:
right = r
return left, right
参考文献:
1.分析了二分法的不同情况,写的不错:https://www.cnblogs.com/luoxn28/p/5767571.html
2. http://blog.csdn.net/int64ago/article/details/7425727
Leetcode 34 Find First and Last Position of Element in Sorted Array 解题思路 (python)的更多相关文章
- [LeetCode] 34. Find First and Last Position of Element in Sorted Array == [LintCode] 61. Search for a Range_Easy tag: Binary Search
Description Given a sorted array of n integers, find the starting and ending position of a given tar ...
- [LeetCode] 34. 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 ...
- (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
Given an array of integers nums sorted in ascending order, find the starting and ending position of ...
- 【LeetCode】34. Find First and Last Position of Element in Sorted Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetc ...
- [leetcode]34.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 ...
- leetcode [34] 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 ...
- 刷题34. Find First and Last Position of Element in Sorted Array
一.题目说明 题目是34. Find First and Last Position of Element in Sorted Array,查找一个给定值的起止位置,时间复杂度要求是Olog(n).题 ...
- leetcode个人题解——#34 Find First and Last Position of Element in Sorted Array
思路:先二分查找到一个和target相同的元素,然后再左边二分查找左边界,右边二分查找有边界. class Solution { public: , end = -; int ends; int lS ...
- 34. Find First and Last Position of Element in Sorted Array + 二分
题意懒得抄了,大概是:在升序数组中给定整数target,找到第一个和最后一个target的索引,找到返回{index1, index2},否则返回{-1, -1}: 时间复杂度要求:O(logn) 分 ...
随机推荐
- 探究编译后,try-with-resources括号中的object是否关闭,以及两种写法编译后的对比
源码(@TargetApi(Build.VERSION_CODES.KITKAT)) public List<T> test1() { String sql = "selxe x ...
- C# 木马功能的简单实现
1.首先解决开机启动木马.通过建立开机启动服务达到目的:2.伪装问题.通过c#反射性能,将正常的.net的exe文件添加监控盗传播取等其他功能,执行正常程序同时,后台悄悄释放windows服务,通过服 ...
- laravel view not found
在windows开发的laravel项目,部署到Linux服务器找不到视图,代码格式可能是这样的 return view('news\list'); 原因是在Linux下不能识别反斜杠路径,解决办法是 ...
- Ubuntu 16.04 安装Kinect V2驱动
1.下载源代码 git clone https://github.com/OpenKinect/libfreenect2.git 2.依赖项安装 sudo apt-get install build- ...
- linux,无法进行写操作怎么办?read-only file system
一句命令搞定: mount -o remount rw /
- NoteBook学习(二)-------- Zeppelin简介与安装
Zeppelin官网地址: http://zeppelin.apache.org/ Github地址: https://github.com/apache/zeppelin (参照官网) 1.什么是z ...
- 意想不到的的异常-由于eclipse和tomcat的交互出错-eclipse断点导致debug启动缓慢
足足启动了200多秒,正赶上hibernate 的使用上全部换使用方式,修改了很多代码.赶在这个节骨点上,出现debug 启动时卡在hibernate 启动的地方不动了,也没掉到debug断点的地方. ...
- skynet记录7:服务(c和lua)
稍后填坑 1.c服务的写法(第一个服务logger分析) 2.lua服务的写法(第二个服务bootstrap分析) 3.snlua包装模块
- WCF系列_WCF常用绑定选择
一.五种常用绑定常用绑定的传输协议以及编码格式 名称 传输协议 编码格式 互操作性 BasicHttpBinding HTTP/HTTPS Text,MTOM Yes NetTcpBinding TC ...
- 正确JAVA从本机获取IP地址的方法
https://www.cnblogs.com/xiaoBlog2016/p/7076230.html