您的位置:首页 > 其它

leetcode之-题34

2016-05-01 22:33 302 查看

题目

Search for a Range

Given a sorted array of integers, 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].

For example,

Given [5, 7, 7, 8, 8, 10] and target value 8,

return [3, 4].

题解

想必大家看到时间要求
O(log n)
,已经想到了需要使用二分查找,二分查找很简单,关键是这个题目要我们找到
target
的区间

其实很简单,分成两步就好了,第一次尽量向左走,第二次尽量向右走,获得左边和右边的位置,返回即可

(1)寻找最左的index: 找到相等时,
high=mid
,让它一直向左走

(2)寻找最右的index: 找到相等时,
low=mid
,让它一直向右走

代码

#!/usr/bin/python
# -*- coding:utf-8 -*-

class Solution(object):
def searchRange(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
if len(nums) == 0:
return [-1, -1]
start_index = self.lsearch(nums, target)
end_index = self.rsearch(nums, target)
return [start_index, end_index]

def rsearch(self, nums, target):
# 二分查找,相等时候一直向右
low = 0
high = len(nums) - 1
while low < high - 1:
mid_index = (low + high) // 2
if nums[mid_index] > target:
high = mid_index - 1
elif nums[mid_index] < target:
low = mid_index + 1
else:
low = mid_index
if nums[high] == target:
return high
elif nums[low] == target:
return low
else:
return -1

def lsearch(self, nums, target):
# 二分查找,一直向左走
low = 0
high = len(nums) - 1
while low < high - 1:
mid_index = (low + high) // 2
if nums[mid_index] > target:
high = mid_index - 1
elif nums[mid_index] < target:
low = mid_index + 1
else:
high = mid_index
if nums[low] == target:
return low
elif nums[high] == target:
return high
else:
return -1

if __name__ == '__main__':

a = Solution()
st = a.searchRange([1,8,8,8,8,9,9,10,10,10,11], 8)
print st
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: