Leetcode-33-Search in Rotated Sorted Array (Hard)
二分查找算法以及旋转之后的数组二分查找算法:
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
__author__ = 'author' class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
return self.sorted_binary_search(nums, 0, len(nums) - 1, target) #二分查找算法
def binary_search(self, nums, start, end, targrt):
if start > end:
return -1
mid = start + (end - start)//2
if nums[mid] > targrt:
return self.binary_search(nums, start, mid - 1, targrt)
elif nums[mid] < targrt:
return self.binary_search(nums, mid + 1, end, targrt)
else:
return mid #旋转数组的折半查找算法
'''
要解决这道题,需要明确rotated sorted array的特性,
那么就是至少有一侧是排好序的(无论pivot在哪,自己画看看)。
接下来就只需要按照这个特性继续写下去就好。 如果target比A[mid]值要小
如果A[mid]右边有序(A[mid]<A[high])
那么target肯定不在右边(target比右边的都得小),在左边找
如果A[mid]左边有序
那么比较target和A[low],如果target比A[low]还要小,
证明target不在这一区,去右边找;反之,左边找。 如果target比A[mid]值要大
如果A[mid]左边有序(A[mid]>A[low])
那么target肯定不在左边(target比左边的都得大),在右边找
如果A[mid]右边有序
那么比较target和A[high],如果target比A[high]还要大,
证明target不在这一区,去左边找;反之,右边找。
'''
def sorted_binary_search(self, nums, start, end, targrt):
if start > end:
return -1
mid = start + (end - start)//2
if targrt == nums[mid]:
return mid
if nums[start] <= nums[mid]:
#如果左侧有序
if nums[start] <= targrt and targrt <= nums[mid]:
#如果target在左侧中
return self.sorted_binary_search(nums, start, mid - 1, targrt)
else:
return self.sorted_binary_search(nums, mid + 1, end, targrt)
else:
#如果右侧有序
if nums[mid] <= targrt and targrt <= nums[end]:
#如果target在右侧中
return self.sorted_binary_search(nums, mid + 1, end, targrt)
else:
return self.sorted_binary_search(nums, start, mid - 1, targrt) if __name__ == '__main__':
s = Solution()
print(s.binary_search([1,2,3,4,5,6,7,8,9], 0, 8, 9))
代码中注释参考了:http://www.cnblogs.com/springfor/p/3858140.html , 该博客中的算法描述比较易懂
Leetcode-33-Search in Rotated Sorted Array (Hard)的更多相关文章
- [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 33 Search in Rotated Sorted Array [binary search] <c++>
LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...
- [LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- LeetCode 33.Search in Rotated Sorted Array(M)
题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...
- leetcode 33. Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- Java [leetcode 33]Search in Rotated Sorted Array
题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...
- [leetcode]33. Search in Rotated Sorted Array旋转过有序数组里找目标值
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)
题目链接 :https://leetcode.com/problems/search-in-rotated-sorted-array/?tab=Description Problem :当前的数组 ...
随机推荐
- 【转】GIT和SVN之间的五个基本区别
如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...
- 浅谈PHP在各系统平台下的换行符
<?php echo 'aaa\n';//用于linux.unix平台C的换行也是如此 echo 'bbb\r';//用于mac平台 echo 'ccc\r\n';//用于windows平台 / ...
- 取得ASKII码值和汉语拼音
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXMAAACmCAIAAACnXPjtAAAgAElEQVR4nO2de3wb1YHv56+7e/fe/e ...
- android中自定义shape
<shape> <!-- 实心 --> <solid android:color="#ff9d77"/> <!-- 渐变 --> & ...
- c#中如何跨线程调用windows窗体控件?
我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来看传统方法: public partial c ...
- Effective C++ 读书总结
(中文第三版 侯捷 译) 这本书在C++领域也是大名鼎鼎,在微博看到有人说,如果以前学过C语言,那只需花一天时间把 Effective C++ 看一遍,然后再看 leveldb代码(http://t. ...
- JS核心概念
Javascript本质第一篇:核心概念 很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽 ...
- 如何编写makefile
一:Makefile介绍: Makefile是为自动化编译而生.我们写好makefile文件后,只需要一个make命令,就可以完成整个项目的编译工作,大大提高了开发效率. 也许刚开始学习编程时,你不会 ...
- 替换__thread的一种方式,实现TLS功能
TLS是由于多线程编程带来的产物,主要是为了解决线程资源局部化,具体内容网上有很多介绍.有很多地方已经支持了该功能,但有些地方没有,下面是GCC的一些介绍,反正具体看实际使用情况: 5.51 Thre ...
- Tomcat中Context的配置
Tomcat直接ip地址访问不用加端口和项目名 当我们开发完一个WEB项目 然后部署到tomcat下,正常情况下应该是这样访问:http://localhost:端口号/项目名 如果我们想让用户仅仅输 ...