leetcode笔记:Search in Rotated Sorted Array
一.题目描写叙述
二.解题技巧
因为这道题出现了旋转的情况,即比第一个元素小的元素可能出如今数值的后半段或者不出现。
因此。能够考虑採用变种的二分查找,即在比較中间元素与目标之前,先比較第一个元素与目标的关系。这个时候,会出现三种情况:
1.第一个元素刚好等于目标,返回第一个元素的坐标,函数结束;
2.第一个元素大于目标。那么目标就可能存在被旋转到数组后面的情况,这个时候,还要比較与数组中间元素的关系,这个时候又会有三种情况:
a.中间元素大于第一个元素,这个时候。目标可能存在于数组的后半段中,递归调用函数,寻找目标的坐标;
b.中间元素等于目标。返回中间元素的坐标,函数结束;
c.中间元素小于第一个元素。这个时候。又能够分为两种情况进行:
(1).中间元素小于目标元素。那么目标元素可能存在于数组的后半段中,递归调用函数,寻找目标的坐标;
(2).中间元素大于目标元素。那么目标元素可能存在于数组的前半段中,递归调用函数。寻找目标的坐标;
3.第一个元素小于目标,这是也有三种情况须要考虑:
a.中间元素等于目标元素,返回中间元素的坐标,函数结束;
b.中间元素大于第一个元素,这个时候,也有两种情况要考虑:
(1).中间元素大于目标,那么目标元素可能存在于数组的前半段中,递归调用函数,寻找目标的坐标;
(2).中间元素小于目标,那么目标元素可能存在于数组的后半段中,递归调用函数,寻找目标的坐标;
c.中间元素小于第一个元素,那么目标元素可能存在于数组的前半段中,递归调用函数,寻找目标的坐标;
当然,还须要考虑数组的元素个数为0,1, 2,的情况,以及对于递归的过程中数组的起始位置坐标以及数组中元素的个数。这些才是这道题的难点所在,我也是调试了非常久才调通代码的。
三.演示样例代码
// 时间复杂度O(log n)。空间复杂度O(1)
#include <iostream>
using namespace std;
class Solution
{
public:
int SearchRotatedSortedArray(int A[], int n, int target)
{
int start = 0;
int end = n;
int middle = start + (end - start) / 2;
while (start != end)
{
if (target == A[middle])
return middle;
if (A[start] < A[middle])
{
if ((target < A[middle]) && (A[start] <= target))
end = middle;
else
start = middle + 1;
}
else
{
if ((target > A[middle]) && (target <= A[end - 1]))
start = middle + 1;
else
end = middle;
}
}
return -1; // 在数组中找不到目标元素时返回-1
}
};
四.体会
这答题的难点在于边界条件和递归过程中的数组的第一个元素的指针设置和数组元素个数的设置上面,边界条件常常是面试题考查的重点。
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 ...
- 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. ...
随机推荐
- ubuntu apt-update NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
Fetched 28.1 MB in 11s (2344 kB/s) W: GPG error: http://archive.canonical.com xenial Release: The fo ...
- js读取文本内容,支持csv.txt
js读取文本内容,支持csv.txt <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...
- python3.x Day6 socketserver
socketserver是啥? 简化了编写网络服务器,就是对于socket的再一次封装sockerserver包含4个类可以使用:A=socketserver.TCPServer() #用于TCP/I ...
- php-fpm进程数管理
PHP-FPM 先来了解一些名词概念: CGI是Common Gateway Interface(通用网管协议),用于让交互程序和Web服务器通信的协议.它负责处理URL的请求,启动一个进程,将客户端 ...
- jQuery对table排序
<script> //col对应列,cmp两数比较方法,返回值为TRUE,FALSE function sort(col, cmp) { var table = $("#test ...
- Django之CBV和FBV
Django之CBV和FBV CBV和FBV是C和F的区别: C是Class,F是Function 在请求中,有GET请求和POST请求. 在写CBV时,url是可以对应一个类的,在类中,分别写出GE ...
- php使用trait遇到的一个问题
php是单继承语言,也是就是一个类只能继承一个单独的原始类自PHP5.4.0起,PHP实现了一种代码复用的方法,称为Traittrait 是在一些类(Class)的应该具备的特定的属性或方法,而同父级 ...
- C++ 类 直接定义对象与new对象的区别
new创建类对象与直接定义的区别 new创建对象的特点 new创建类对象需要指针接收,一处初始化,多处使用 new创建类对象使用完需delete销毁 new创建对象直接使用堆空间,而局部不用new定义 ...
- 牛客网NOIP赛前集训营 第6场 T1 最长路
[题解] 先建反向图,然后跑拓扑排序求出最长路. 将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字.起点的排名为第二关键字排序. 按照这个顺序更新这一层的答案,按照这一层每 ...