Search in Rotated Sorted Array 系列题解

题目来源:

Search in Rotated Sorted Array

Search in Rotated Sorted Array II


第一版

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.

Solution

class Solution {
public:
int search(vector<int>& nums, int target) {
if (nums.empty()) return -1;
int size = nums.size();
int low = 0, high = size - 1, mid;
while (low < high) {
mid = (low + high) / 2;
if (nums[mid] > nums[high])
low = mid + 1;
else
high = mid;
} if (low > 0 && target >= nums[0]) {
high = low - 1;
low = 0;
} else {
high = size - 1;
}
while (low <= high) {
mid = (low + high) / 2;
if (target == nums[mid])
return mid;
else if (target > nums[mid])
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
};

解题描述

这道题题意是,给出一个数组,数组原本是升序的,但是被从中间某个位置截断,后面一段被放到前面,要求在数组中找到目标数字target的位置。这里首选的做法肯定是二分查找,不过要先用二分查找找到截断的位置,然后根据target与数组第一个元素的大小关系决定其所在半区,再进行二分查找。


进阶版本

Follow up for "Search in Rotated Sorted Array":

What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

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

Write a function to determine if a given target is in the array.

The array may contain duplicates.

Solution

解法一:从左向右遍历数组,找到数组旋转的位置

class Solution {
public:
bool search(vector<int>& nums, int target) {
if (nums.empty()) return false;
int size = nums.size();
int low = 0, high = size - 1, mid;
for (; low < size; low++) {
if (low > 0 && nums[low - 1] > nums[low]) break;
} if (low > 0 && target >= nums[0]) {
high = low - 1;
low = 0;
} else {
high = size - 1;
}
while (low <= high) {
mid = (low + high) / 2;
if (target == nums[mid])
return true;
else if (target > nums[mid])
low = mid + 1;
else
high = mid - 1;
}
return false;
}
};

解法二:使用二分查找,结合查重夹逼

class Solution {
public:
bool search(vector<int>& nums, int target) {
if (nums.empty()) return false;
int low = 0, high = nums.size() - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
if (nums[mid] == target) return true; if (nums[low] == nums[mid] && nums[mid] == nums[high]) {
++low;
--high;
} else if (nums[low] <= nums[mid]) {
if (nums[low] <= target && nums[mid] > target)
high = mid - 1;
else
low = mid + 1;
} else {
if (nums[mid] < target && nums[high] >= target)
low = mid + 1;
else
high = mid - 1;
}
}
return false;
}
};

解题描述

这道题题意是,给出一个排好序的数组,在数组中间某个位置截断,将后面一段放到前面,并且数组中可能存在重复的元素,然后要求判断数组中是否存在目标数字target。上面给出了2种解法,第一种解法相对来说比较暴力,平均的时间复杂度为O(n / 2)。而第二种解法虽然在出现高低位游标元素重复的时候进行了线性移位,但是最优时间复杂度位O(log n),最差时间复杂度是O(n),相对来说还是有一定的优化。

[Leetcode] Search in Rotated Sorted Array 系列的更多相关文章

  1. LeetCode:Search in Rotated Sorted Array I II

    LeetCode:Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to y ...

  2. LeetCode: Search in Rotated Sorted Array II 解题报告

    Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...

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

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

  4. [LeetCode] 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 ...

  5. LeetCode——Search in Rotated Sorted Array II

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

  6. [leetcode]Search in Rotated Sorted Array II @ Python

    原题地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/ 题意: Follow up for "Sea ...

  7. LeetCode: Search in Rotated Sorted Array 解题报告

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  8. LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  9. [LeetCode] Search in Rotated Sorted Array I (33) && II (81) 解题思路

    33. Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you be ...

随机推荐

  1. Redis学习笔记一:Redis安装

    Redis安装 1.下载进入redis官网下载redis-xxx.tar.gz包 2.将redis-xxx.tar.gz拷贝到Linux某一目录下并对其进行解压 tar -zxvf Redis-xxx ...

  2. 菜鸟在线教你用Unity3D开发VR版的Hello World

    大家好,我是菜鸟在线的小编.这篇短文将告诉大家如何用Unity3D开发VR版的Hello World. 1开启SteamVR并连接Vive设备 (a)登录Steam客户端,并点击右上角的VR按钮,这时 ...

  3. Unity3D for VR 学习(10): Unity LOD Group 组件

    LOD (Level of Detail), 远小近大思想. LOD,在Unity中是用到了空间换时间的优化方法:即程序加载2套模型,导致包会增大:在运行时刻,远处的用面数少的模型–模糊一些,近处用面 ...

  4. OpenFlow 消息

    消息类型 OpenFlow 的消息共分为三类: Controller-to-Switch 顾名思义,此类消息是由控制器主动发出 Features 用于获取交换机特性 Configuration 用于配 ...

  5. Linux必知必会——xargs命令

    1.功能: xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令.因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时 ...

  6. [CodeVs1515]跳(lucas定理+费马小定理)

    嘿嘿嘿好久没写数学题了,偶尔看到一道写一写... 题目大意:一个(n+1)*(m+1)[0<=n, m<=10^12,n*m<=10^12]的矩阵,C(0,0)=1,C(x,y)=C ...

  7. 解题:APIO 2014 回文串

    题面 初见SAM 洛谷数据太弱了,我SAM写错了居然有90pts=.=??? SAM求一个子串$(l,r)$的出现次数:从右端点对应状态开始在parent树上倍增,当目标节点的$len$大于等于子串长 ...

  8. dorado事件

    //----------------------------------------------------------------------------// //校验实体数据是否填写if(enti ...

  9. struts2 文件下载的处理

  10. C++ STL 一般总结(转载)

    注:原博地址:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/22/2603525.html 以下内容来源网上 经过整合而成 一.一般介绍 STL ...