[LeetCode 题解] Search in Rotated Sorted Array
前言
【LeetCode 题解】系列传送门:
http://www.cnblogs.com/double-win/category/573499.html
题目描述
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might 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.
# 题意
假设有一个有序的循环数组, 其起始位置未知。
如 序列```0 1 2 4 5 6 7``` 可能的数组形式为 ```4 5 6 7 0 1 2```
给定一个目标数据,查找该数据是否在给定的数组中出现。 如果在数组中找到该目标数据,则返回该目标数据所在的数组下标, 否则返回-1.
Tips: 假设给定的数组中没有重复的元素
# 思路
根据题意提取关键信息: 在一个***sorted array***中查找给定元素
首先能够想到的是binary search。 由于数组是一个循环数组, 那么数组的最小值和最大值并不一定分别在数组两端。
(1) 思路一: 从头到尾,依次遍历数组, 查找目标元素, 其时间复杂度O(n)
(2) 思路二: 从头到尾寻找min, max, 然后将左侧较大的数据concat到右侧, 然后再用binary search。 时间复杂度 O(n/2) + O(logn) ~ O(n)
(3) 思路三:如果将原始数组分割成左右两半, 可以发现其具有如下几种情形:
> case 1: 最小值和最大值分别在左右两侧:
> ```leftpart: [0 1 2 4] rightpart:[5 6 7]```
> 值得注意的是该情况最大值只能在最右侧, 且最小值只能在最左侧
> case 2:
> 最大值和最小值同侧: 最大值在右侧
> ```leftpart: [ 2 4 5 6] rightpart: [7 0 1]```
> 可以发现 leftValue = 2 medianValue = 6 rightValue = 1
> medianValue > leftValue && medianValue > rightValue:
> 如果 target > medianValue 或者 target < rightValue, 那么必在rightpart
> 否则,必在leftpart
> case 3:
> 最大值和最小值同侧: 最小值在左侧
> ```leftpart: [6 7 0 1] rightpart: [2 4 5]```
> 可以发现 leftValue = 6 medianValue = 1 rightValue = 5
> medianValue < leftValue && medianValue < rightValue:
> 如果 target < medianValue 或者 target > rightValue, 那么必在leftpart
> 否则,必在rightpart
加上一些边界条件,即得结果。
# 解法
```python
class Solution(object):
def findTarget(self, nums, minIndex, maxIndex, target):
"""
:type nums: List[index]
:type minIndex: int
:type maxIndex: int
:type target: int
:rtype: int
"""
if nums[minIndex] == target:
return minIndex
if nums[maxIndex] == target:
return maxIndex
if maxIndex == minIndex:
return 0 if target == nums[minIndex] else -1
median = (minIndex + maxIndex) / 2
if nums[median] == target:
return median
if nums[median] > nums[minIndex] and nums[median] > nums[maxIndex]:
# maxValue and minValue is in right part
if target > nums[median] or target < nums[minIndex]:
return self.findTarget(nums, median + 1, maxIndex, target)
else:
return self.findTarget(nums, minIndex, median, target)
elif nums[median] < nums[minIndex] and nums[median] < nums[maxIndex]:
# maxValue is in left part
if target < nums[median] or target > nums[maxIndex]:
return self.findTarget(nums, minIndex, median, target)
else:
return self.findTarget(nums, median + 1, maxIndex, target)
else:
# maxValue is in maxIndex and minValue is in minIndex
if target < nums[minIndex] or target > nums[maxIndex]:
return -1
elif target > nums[median]:
return self.findTarget(nums, median + 1, maxIndex, target)
else:
return self.findTarget(nums, minIndex, median, target)
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
numSize = len(nums)
# the array is empty
if numSize == 0:
return -1
minIndex = 0
maxIndex = numSize - 1
return self.findTarget(nums, minIndex, maxIndex, target)
声明
| 作者 | Double_Win |
| 出处 | http://www.cnblogs.com/double-win/p/7966913.html |
| 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者保留追究法律责任的权利。 若本文对你有所帮助,您的关注和推荐是我们分享知识的动力! |
[LeetCode 题解] Search in Rotated Sorted Array的更多相关文章
- [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)
指数:[LeetCode] Leetcode 解决问题的指数 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 033. ...
- [array] leetcode - 33. Search in Rotated Sorted Array - Medium
leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...
- LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>
LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++> 给出排序好的一维有重复元素的数组,随机取一个位置断开 ...
- LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>
LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...
- [leetcode]81. Search in Rotated Sorted Array II旋转过有序数组里找目标值II(有重)
This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates. 思路 ...
- Java for LeetCode 081 Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
- [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- Leetcode系列-Search in Rotated Sorted Array
做Leetcode题有一段时间了,但都是断断续续的,到现在才做了30题左右,感觉对自己来说还是有点难度的.希望自己能继续坚持下去,在校招前能解决超过一百题吧. 其实这些题就是用来训练你的解题思路的,做 ...
- LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
随机推荐
- dubbo通信协议
对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: ...
- Java的继承与接口
为什么Java里面只允许单一继承,但允许实现多个接口? 1,为什么不能实现类的多继承?主要是防止多个类有相同的方法名,然而方法体不一样,子类就比较难选择了.所以java和C#不支持类的多继承2,允许具 ...
- Majority Element(ARRAY-BINARY SEARCH)
QUESTION Given an array of size n, find the majority element. The majority element is the element th ...
- 迭代器&生成器&yield异步
迭代器 #迭代器是访问集合元素的一种形式,迭代器从集合的第一个元素开始访问,直到所有的元素被访问# 结束才结束,迭代器只能往前访问,不能往后访问,比如你先访问1,在访问2,在访问3.如果已经# 访问到 ...
- Jmeter元件作用域
转载自飞测团队
- MongoDB的数据类型(四)
JSON JSON是一种简单的数据表示方式,它易于理解.易于解析.易于记忆.但从另一方面来说,因为只有null.布尔.数字.字符串.数组和对象这几种数据类型,所以JSON有一定局限性.例如,JSON没 ...
- 18-从n个数中选m个
#include <iostream>using namespace std; int f(int n, int m){ if(n < m) //这个条 ...
- 批量MD5命名文件
#coding=utf-8 import os import hashlib def GetFileMd5(filename): if not os.path.isfile(filename): pr ...
- Spring集成Redis使用注解
转载:http://blog.csdn.net/u013725455/article/details/52129283 使用Maven项目,添加jar文件依赖: <project xmlns=& ...
- git format-patch 用法【转】
本文转载自:http://blog.csdn.net/xzongyuan/article/details/9425739 git format-patch相对于git diff更便于操作,是更新的打包 ...