LeetCode 33 搜索旋转排序数组
题目:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
解题思路:
由于题目要求时间复杂度为O(logn), 并且是有序的查找,我们自然先想到二分查找。
对于{0,1,2,4,5,6,7}这个例子,我们试着将它所有的旋转例子都列出来,如下:
0 1 2 4 5 6 7
7 0 1 2 4 5 6
6 7 0 1 2 4 5
5 6 7 0 1 2 4
4 5 6 7 0 1 2
2 4 5 6 7 0 1
1 2 4 5 6 7 0
发现规律:当中间数小于最右边数时,则其右半段是有序的,当中间数大于最右边的数时,则其左半段是有序的。容易发现不管从哪个位置开始翻转,都有半段是有序的。这样,我们就可以使用二分法来做了。
代码:
 class Solution {
 public:
     int search(vector<int>& nums, int target) {
         int left = ;
         int right = nums.size() - ;
         while(left <= right) {
             int mid = (left + right)/;
               if(nums[mid] == target) {
                   return mid;
               }
             if(nums[mid] < nums[right]) {
                 if(nums[mid] < target && nums[right] >= target)
                     left = mid + ;
                 else
                     right = mid - ;
             }
             else {
                 if(nums[mid] > target && nums[left] <= target)
                     right = mid - ;
                 else
                     left = mid + ;
             }
         }
         return -;
     }
 };
LeetCode 33 搜索旋转排序数组的更多相关文章
- Java实现 LeetCode 33 搜索旋转排序数组
		33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ... 
- 力扣Leetcode 33. 搜索旋转排序数组
		33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ... 
- [leetcode] 33. 搜索旋转排序数组(Java)
		33. 搜索旋转排序数组 说实话这题我连题都没有看懂....真是醉了 二分,没意思,直接交了- - https://www.jiuzhang.com/solutions/search-in-rotat ... 
- leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II
		33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ... 
- LeetCode 33 - 搜索旋转排序数组 - [二分]
		假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ... 
- [LeetCode]33. 搜索旋转排序数组(二分)
		题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目 ... 
- LeetCode 33——搜索旋转排序数组
		1. 题目 2. 解答 2.1. 方法一 直接进行二分查找,在判断查找方向的时候详细分类. 当 nums[mid] < target 时, 若 nums[left] <= nums[mid ... 
- leetcode 33搜索旋转排序数组
		暴力解法:O(n) 想办法用二分查找Ologn 
- LeetCode 81——搜索旋转排序数组 II
		1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1], ... 
随机推荐
- Python记录12:迭代器+生成器+生成式
			'''1. 什么是迭代器 什么是迭代:迭代就是一个重复的过程,但是每一次重复都是基于上一次的结果而进行的 单纯的重复不是迭代: while True: print(1) 迭代的过程 l=['a','b ... 
- caffe-ssd的GPU在make runtest的时候报错:BatchReindexLayerTest/2.TestGradient,where TypeParam=caffe::GPUdevice(<float>)(<double>)
			make runtest报错:BatchReindexLayerTest/2.TestGradient,where TypeParam=caffe::GPUdevice<float> Ba ... 
- POJ 2533 裸的LIS
			A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given ... 
- 133. Clone Graph(图的复制)
			Given the head of a graph, return a deep copy (clone) of the graph. Each node in the graph contains ... 
- 21 python的魔法方法(转)
			魔法方法 含义 基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法2. 它的第一个参数是这个类,其他的参数是用来直接传递给 _ ... 
- Linux基础培训知识点汇总
			一.Linux简介1.Linux操作系统诞生于1991年10月5日,由林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生.2.Linux同时也衍生了很多版本( ... 
- perl 用网易发邮件报错 554 DT:SPM 163 smtp14
			查看相关链接,貌似被当成垃圾邮件了,发不出去 554 DT:SPM 163 smtp14,EsCowACHUegmKpdc3giRMQ--.29617S2 1553410599,please see ... 
- CSS——background-size实现图片自适应
			在网页端,我们经常想让图片能够自适应拉伸缩放,使之可以完美的嵌入我们给定的容器里,比如div,button,input,下面我将用代码来说明如何实现这个功能! 一.div背景图自适应 如果知道图片都有 ... 
- dart字符串处理
			1.字符串创建(1)使用单引号,双引号创建字符串(2)使用三个引号或双引号创建多行字符串(3)使用r创建原始raw字符串(转义字符等特殊字符会输出出来,而不会自动被转义) (1)例如:String s ... 
- Python xml模块
			xml模块 自己创建xml文档 import xml.etree.cElementTree as ET new_xml = ET.Element("personinfolist") ... 
