33. Search in Rotated Sorted Array leetcode python 2016 new season
2016-01-19 12:46
543 查看
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
1. find the pivot
2. do binary search in each part
if it is on the right side the index needs to be right_result + pivot
class Solution(object):
def findPivot(self, nums):
low = 0
high = len(nums) - 1
while low < high and nums[low] > nums[high]:
mid = low + (high - low) / 2
if nums[mid] < nums[high]:
high = mid
else:
low += 1
return low
def binSearch(self, nums, target):
low = 0
high = len(nums) - 1
while True:
if low > high:
return -1
mid = low + (high - low) / 2
if target < nums[mid]:
high = mid - 1
elif target > nums[mid]:
low = mid + 1
else:
return mid
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums) == 1 and nums[0] != target:
return -1
elif len(nums) == 1 and nums[0] == target:
return 0
pivot = self.findPivot(nums)
left_result = self.binSearch(nums[:pivot], target)
right_result = self.binSearch(nums[pivot:], target)
if right_result != -1:
right_result += pivot
return max(left_result, right_result)
(i.e.,
0 1 2 4 5 6 7might become
4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
1. find the pivot
2. do binary search in each part
if it is on the right side the index needs to be right_result + pivot
class Solution(object):
def findPivot(self, nums):
low = 0
high = len(nums) - 1
while low < high and nums[low] > nums[high]:
mid = low + (high - low) / 2
if nums[mid] < nums[high]:
high = mid
else:
low += 1
return low
def binSearch(self, nums, target):
low = 0
high = len(nums) - 1
while True:
if low > high:
return -1
mid = low + (high - low) / 2
if target < nums[mid]:
high = mid - 1
elif target > nums[mid]:
low = mid + 1
else:
return mid
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums) == 1 and nums[0] != target:
return -1
elif len(nums) == 1 and nums[0] == target:
return 0
pivot = self.findPivot(nums)
left_result = self.binSearch(nums[:pivot], target)
right_result = self.binSearch(nums[pivot:], target)
if right_result != -1:
right_result += pivot
return max(left_result, right_result)
相关文章推荐
- Python 的socke编程示例
- python 环境搭建及pycharm的使用
- Python特殊语法:filter、map、reduce、lambda [转]
- python 协程
- Python序列之列表 (list)
- 自学Python八 爬虫大坑之网页乱码
- 《python》学习笔记(Day2),读入磁盘文件,经过处理,保存成相应的磁盘文件
- python中numpy库matrix和array的融合使用
- python文件操作
- PYTHON-基础-时间日期处理小结
- Transform from list in python to mat in numpy
- Python中list的实现
- python操作mysql总结
- python字符串/元组/列表/字典互转
- [python] - profilers性能分析器
- python的学习资源
- python浅拷贝与深拷贝
- Python算法题----求出和为S的所有连续正整数数列
- Python学习——struct模块的pack、unpack示例
- 配置caffe的python接口及其易错点