1. 原题链接

https://leetcode.com/problems/search-in-rotated-sorted-array/description/

2. 题目要求

给定一个按升序排列的数组nums[ ]和目标值target,将数组在某点处进行旋转,然后在旋转后的数组中查找与target相同的元素,存在返回其下标,不存在返回“-1”。

注意:旋转点未知

例,{1, 2, 3, 4, 5, 6, 7}旋转后可能为:

{4, 5, 6, 7,1,2, 3}

{3, 4, 5, 6, 7,1,2}

{6,7,1, 2, 3, 4, 5}

......

3. 解题思路

思路一:暴力解决,遍历数组进行匹配,时间复杂度为O( n );

思路二:巧妙利用旋转数组

(1)旋转数组的性质:旋转后的数组由两段按升序排列的数组组成。

(2)先找出旋转点,旋转点左右两边都是按升序排列的数组;

(3)然后判断target在旋点的左边还是右边:用target和左右两边两个升序数组的最后一位进行比较,即可知道target在哪一边;

(4)利用折半查找法进行查找。找到返回元素所在下标,否则返回-1。

时间复杂度为O( logn )

例如,target =4 ,旋转后的数组为{4, 5, 6, 7,1,2, 3},首先找到旋转点“1”。target = 4>3,所以target =4在左半边。然后在左半边进行折半查找,返回查找结果。

4. 代码实现

 public class SearchInRotatedSortedArray {
public static void main(String[] args) {
SearchInRotatedSortedArray si = new SearchInRotatedSortedArray();
int[] nums1 = {};
int[] nums2 = {4, 5, 6, 7, 0, 1, 2};
System.out.println(si.search(nums1, 5));
System.out.println(si.search(nums2, 5));
} public int search(int[] nums, int target) {
if (nums.length == 0) return -1; // 数组为空返回 -1
int pivot = findMinIdx(nums);
if (target == nums[pivot]) return pivot; // target恰好等于旋转点未知的元素,直接返回
int len = nums.length;
int start, end; /**
* 采用二分法进行查找
*/
if (target > nums[len - 1]) {
start = 0;
end = pivot;
} else {
start = pivot;
end = len - 1;
} while (start <= end) {
int mid = start + (end - start) / 2;
if (nums[mid] == target) return mid;
else if (target > nums[mid]) start = mid + 1;
else end = mid - 1;
}
return -1; // 不存在target返回-1
} // 找出旋转点
public int findMinIdx(int[] nums) {
int start = 0, end = nums.length - 1;
while (start < end) {
int mid = start + (end - start) / 2;
if (nums[mid] > nums[end])
start = mid + 1;
else end = mid;
}
return start;
}
}

运行结果:

LeetCode:33. Search in Rotated Sorted Array(Medium)的更多相关文章

  1. LeetCode 33.Search in Rotated Sorted Array(M)

    题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...

  2. Python 解LeetCode:33. Search in Rotated Sorted Array

    题目描述:在一个旋转数组中查找给定的值,其中旋转数组中不含重复值: 思路: 第一遍二分遍历,找到数组中最小值的索引: 第二遍分别对最小值左右两边的数组进行二分查找: class Solution(ob ...

  3. [Leetcode][Python]33: Search in Rotated Sorted Array

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 33: Search in Rotated Sorted Arrayhttps ...

  4. LeetCode题解33.Search in Rotated Sorted Array

    33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...

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

  6. 【LeetCode】33. Search in Rotated Sorted Array (4 solutions)

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

  7. leetcode 之Search in Rotated Sorted Array(四)

    描述 Follow up for ”Search in Rotated Sorted Array”: What if duplicates are allowed?    Would this aff ...

  8. 【一天一道LeetCode】#33. Search in Rotated Sorted Array

    一天一道LeetCode 本系列文章已全部上传至我的github,地址: https://github.com/Zeecoders/LeetCode 欢迎转载,转载请注明出处 (一)题目 Suppos ...

  9. 【LeetCode】33. Search in Rotated Sorted Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

随机推荐

  1. AngularJs学习笔记--Understanding the Controller Component

    原版地址:http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model 在angular中,controller是一个javasc ...

  2. Parcel是个好玩意儿

    今天学习了一下Parcel打包工具,确实感觉十分简单易上手,基本不需要配置,未来可能是一个主流的打包工具.相比较于Webpack来说,Parcel简直是毫无难度.接下来总结一下我的学习收获. 1 安装 ...

  3. Django的开发服务的搭建和使用

    创建一个项目¶ 如果这是你第一次使用Django,你需要完成一些初始化操作. 即,你需要自己用代码来创建一个Django项目 ——一个Django实例所需的设置集合,包括数据库的配置.Django的配 ...

  4. Mac iTerm2使用总结

    1.快捷键大全新建标签:command + t关闭标签:command + w切换标签:command + 数字 command + 左右方向键切换全屏:command + enter查找:comma ...

  5. 九.mysql数据库多实例安装mysqld_multi [start,stop,report]

    经常应为系统硬件短缺,导致需要在同一台硬件服务器上面安装多个mysql实例.之前的文章四·安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz(基于Centos7源码 ...

  6. UVa 12716 - GCD XOR(筛法 + 找规律)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. Avito Cool Challenge 2018 B. Farewell Party 【YY】

    传送门:http://codeforces.com/contest/1081/problem/B B. Farewell Party time limit per test 1 second memo ...

  8. [19/03/30-星期六] IO技术_四大抽象类_ 字节流( 字节输入流 InputStream 、字符输出流 OutputStream )_(含字节文件缓冲流)

    一.概念及分类 InputStream(输入流)/OutputStream(输出流)是所有字节输入输出流的父类 [注]输入流和输出流的是按程序运行所在的内存的角度划分的 字节流操作的数据单元是8的字节 ...

  9. jquery基础介绍-转

    学习目的:理解 Ajax 及其工作原理,构建网站的一种有效方法. Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 下面是 Ajax 应用程 ...

  10. 利用python进行数据分析——(一)库的学习

    总结一下自己对python常用包:Numpy,Pandas,Matplotlib,Scipy,Scikit-learn 一. Numpy: 标准安装的Python中用列表(list)保存一组值,可以用 ...