lintcode: search for a range 搜索区间
2016-01-07 16:10
651 查看
题目
如果目标值不在数组中,则返回
样例
给出
返回
挑战
时间复杂度 O(log n)
解题
正常解法是二分法分别找左右边界的,时间复杂度O(logN),但是要注意边界,边界很多种情况的。
找左边界:
1.起始位置是0的单独考虑:nums[0] == target return 0
2.正常的二分查找思想
找右边界:
1.结束位置单独考虑:nums[right] == target return right
2.正常的二分查找思想
Java
Python Code
搜索区间
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。如果目标值不在数组中,则返回
[-1, -1]
样例
给出
[5, 7, 7, 8, 8, 10]和目标值target=
8,
返回
[3, 4]
挑战
时间复杂度 O(log n)
解题
正常解法是二分法分别找左右边界的,时间复杂度O(logN),但是要注意边界,边界很多种情况的。
找左边界:
1.起始位置是0的单独考虑:nums[0] == target return 0
2.正常的二分查找思想
while(left <= right){ int median = (left + right)/2; if(nums[median] < target){ left = median+1; }else if(nums[median]>target){ right = median -1; }else if(nums[median]==target){ if(nums[median-1]!=target) return median; else right = median - 1; } }
找右边界:
1.结束位置单独考虑:nums[right] == target return right
2.正常的二分查找思想
while(left <= right){ int median = (left + right)/2; if(nums[median] < target){ left = median+1; }else if(nums[median]>target){ right = median -1; }else if(nums[median]==target){ if(nums[median+1]!=target) return median; else left = median + 1; } }
Java
class Solution: """ @param A : a list of integers @param target : an integer to be searched @return : a list of length 2, [index1, index2] """ def searchRange(self, A, target): # write your code here res = [-1,-1] if A==None or len(A) == 0: return res res[0] = self.BoundaryLeft(A,0,len(A)-1,target) res[1] = self.BoundaryRight(A,0,len(A)-1,target) return res def BoundaryLeft(self,A,left,right,target): if A[0] == target: return 0 while left<= right: median = (left + right)/2 if A[median] < target: left = median + 1 elif A[median] > target: right = median -1 elif A[median] == target: if A[median-1]!=target: return median else: right = median -1 return -1 def BoundaryRight(self,A,left,right,target): if A[right] == target: return right while left<= right: median = (left+ right)/2 if A[median] < target: left = median + 1 elif A[median] > target: right = median - 1 elif A[median] == target: if A[median + 1]!=target: return median else: left = median + 1 return -1
Python Code
相关文章推荐
- 自定义UI(由下而上版)之第二阶段
- MySQL学习笔记之二:源码编译安装和二进制格式安装MariaDB
- Decorator模式——设计模式学习笔记
- FlyWeight模式——设计模式学习笔记
- 理解快速傅里叶变换(FFT)算法
- Createprocess 输入输出重定向到文件
- Swift中自定义Cell
- Struts2中的包的作用描述
- java内存溢出分析(一)
- Linux安装Mysql rpm
- Java中的日期(Calendar、Date)
- Activex、OLE、COM、OCX、DLL之间区别、联系[转]
- 上市公司频推高送转 年报预告掘金“白马股”(名单)
- centos安装ORACLE 11G
- Java软件工程师等级
- 日积月累--Groovy语言规范之操作符
- 第8章3节《MonkeyRunner源码剖析》3
- ceph源码分析之Log实现
- Android中Parcelable用法
- Swift场景过渡总结