一.题目描写叙述

二.解题技巧

因为这道题出现了旋转的情况,即比第一个元素小的元素可能出如今数值的后半段或者不出现。

因此。能够考虑採用变种的二分查找,即在比較中间元素与目标之前,先比較第一个元素与目标的关系。这个时候,会出现三种情况:

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的更多相关文章

  1. [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)

    指数:[LeetCode] Leetcode 解决问题的指数 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 033. ...

  2. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  3. LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>

    LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++> 给出排序好的一维有重复元素的数组,随机取一个位置断开 ...

  4. LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>

    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...

  5. [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. 思路 ...

  6. 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 ...

  7. [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  8. Leetcode系列-Search in Rotated Sorted Array

    做Leetcode题有一段时间了,但都是断断续续的,到现在才做了30题左右,感觉对自己来说还是有点难度的.希望自己能继续坚持下去,在校招前能解决超过一百题吧. 其实这些题就是用来训练你的解题思路的,做 ...

  9. LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  10. 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. ...

随机推荐

  1. powerdesigner连接MySQL数据库时出现Non SQL Error : Could not load class com.mysql.jdbc.Driver

    Non SQL Error : Could not load class com.mysql.jdbc.Driver 这是因为powerdesigner 无法找到驱动所产生的 解决办法是:配置系统的c ...

  2. webstorm下开发微信小程序

  3. ionic提供的配色方案

    .light #ffffff .stable #f8f8f8 .positive #387ef5 .calm #11c1f3 .balanced #33cd5f .energized #ffc900 ...

  4. group by两个条件

    学生表: 成绩表: 问题:统计各系各门课程的平均成绩 答案: select sdept,cno,AVG(grade)avg_grade from S join SC on S.sno = SC.sno ...

  5. 零基础入门学习Python(29)--文件:一个任务

    知识点 一个任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来: #record.txt文件内容: 小客服:小甲鱼,今天有客户问你有没有女朋友? 小甲鱼:咦?? 小客服:我跟她 ...

  6. Linux忘记root密码,密码找回,图片展示

    忘记root密码 CentOS 7参考地址如下:https://www.baidu.com/s?wd=CentOS7+%E6%89%BE%E5%9B%9Eroot%E5%AF%86%E7%A0%81& ...

  7. 第二次 Ubuntu16.04 vi编辑器的方向键和退格问题

    新安装ubuntu后,好多人可能都碰到过这样的问题,vi对文件进行编辑时,上下左右键变成了ABDC,退格键也不管用. 解决办法其实也很简单,首先卸载掉旧的vim-common. apt-get rem ...

  8. eclipse 导入svn项目并添加server

    1.打开svn资源库 window-->show view-->other-->svn-->svn资源库 2.控制台选中文件夹右键-->检出为--finish 3.添加服 ...

  9. Linux笔记:定时任务和文件操作

    查看定时任务 crontab -l 注册定时任务 crontab -e然后就像 vim 一样编辑自己的定时任务.如: * * * * * . /home/hadoop/timer/check_job. ...

  10. 一练Splay之维修数列第一次

    平衡树并不是之前没写过,觉得有必要把平衡树变成考场上能敲的东西,也就是说,考一道诸如“维修数列”这样的送分题,要能拿满分. 维修数列.给定一个数列支持以下操作: 输入的第1 行包含两个数N 和M(M ...