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. LDPC译码器的FPGA实现

    应用笔记 V0.0 2015/3/17 LDPC译码器的FPGA实现   概述   本文将介绍LDPC译码器的FPGA实现,译码器设计对应CCSDS131x1o1s文档中提到的适用于深空通信任务的LD ...

  2. 第202天:js---原型与原型链终极详解

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...

  3. C#使用 SharpSSH

    准备试一把监控Linux机器 . 附件如下 :http://files.cnblogs.com/files/lclblog/Tamir.SharpSsh.zip

  4. elsarticle模板 去掉摘要前后的两条横线

    参考:http://www.newsmth.net/nForum/#!article/TeX/316697?au=ericfire 如图:使用elsarticle模板修改PDF格式,去掉摘要前后的横线 ...

  5. 【JavaScript】获取项目路径地址

    在jsp页面顶上面定义 <% String path = request.getContextPath(); String basePath = request.getScheme() + &q ...

  6. CF44H Phone Number

    题意翻译 给你一个电话号码,根据这个号码生成一个新的号码.生成的规则就是 新号码的第一个数任意选(0-9), 然后之后的每一个新号码都按照以下规则生成: 第i个新号码=(第i-1个新号码+第i个老号码 ...

  7. [您有新的未分配科技点]数位DP:从板子到基础(例题 bzoj1026 windy数 bzoj3131 淘金)

    只会统计数位个数或者某种”符合简单规律”的数并不够……我们需要更多的套路和应用 数位dp中常用的思想是“分类讨论”思想.下面我们就看一道典型的分类讨论例题 1026: [SCOI2009]windy数 ...

  8. NHibernate 设置主键不自增长

    1.Model 配置 [PrimaryKey(PrimaryKeyType.Assigned,"ID")] 2.使用时要手动赋值

  9. Visual Format Language(VFL)视图约束

    约束(Constraint)在IOS编程中非常重要,这关乎到用户的直接体验问题. IOS中视图约束有几种方式,常见的是在IB中通过Pin的方式手动添加约束,菜单Editor->Pin->. ...

  10. python基础----__next__和__iter__实现迭代器协议

    #_*_coding:utf-8_*_ __author__ = 'Linhaifeng' class Foo: def __init__(self,x): self.x=x def __iter__ ...