LeetCode:33. Search in Rotated Sorted Array(Medium)
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)的更多相关文章
- LeetCode 33.Search in Rotated Sorted Array(M)
题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...
- Python 解LeetCode:33. Search in Rotated Sorted Array
题目描述:在一个旋转数组中查找给定的值,其中旋转数组中不含重复值: 思路: 第一遍二分遍历,找到数组中最小值的索引: 第二遍分别对最小值左右两边的数组进行二分查找: class Solution(ob ...
- [Leetcode][Python]33: Search in Rotated Sorted Array
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 33: Search in Rotated Sorted Arrayhttps ...
- 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 ...
- 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. ...
- 【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 ...
- leetcode 之Search in Rotated Sorted Array(四)
描述 Follow up for ”Search in Rotated Sorted Array”: What if duplicates are allowed? Would this aff ...
- 【一天一道LeetCode】#33. Search in Rotated Sorted Array
一天一道LeetCode 本系列文章已全部上传至我的github,地址: https://github.com/Zeecoders/LeetCode 欢迎转载,转载请注明出处 (一)题目 Suppos ...
- 【LeetCode】33. Search in Rotated Sorted Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
随机推荐
- Oracle 查找带有CLOB字段的所有表
查找带有CLOB字段的以HEHE开头的所有表 select t.column_name ,DATA_TYPE,TABLE_NAMEfrom user_tab_columns twhere t.TABL ...
- PhoneGap实现重力感应
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 2017 计蒜之道 初赛 第一场 A、B题
A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏——成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋 ...
- MVVM的核心:双向绑定
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致. 唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewMod ...
- BZOJ1770:[USACO]lights 燈(高斯消元,DFS)
Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...
- HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6470 Count Time Limit: 6000/3000 MS (Java/Others) ...
- MSF入侵安卓手机
MSF是Metasploit的简称,Metasploit是一款开源的安全漏洞检测工具,非常强大,分别有Windows版和Linux版,工具里集成了许多微软公布的漏洞(0day). 我这里做测试的系统是 ...
- LayIM.NetClient 组件开发记录
前言 好久没写博客了.前阶段看了下Hangfire组件,后来对其代码比较感兴趣,当时不太了解他如何生成的页面和一些访问请求等.后来看了下源代码,发现原来是 OWIN 在搞怪.于是乎开始深入研究Hang ...
- iOS中的应用启动原理
iOS中的应用启动原理 来源: http://m.blog.csdn.net/article/details?id=50530090 http://m.warting.com/program/2016 ...
- 课时22.br标签(掌握)
br标签,如何在html中换行,可以使用br标签 1.br标签的作用:换行 2.br标签的格式:<br> 3.br标签的注意点: 3.1多个br标签可以连续使用,使用了多个br标签就会换多 ...