说明

算法:Search in Rotated Sorted Array
地址:https://leetcode.com/problems/search-in-rotated-sorted-array/

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.

Your algorithm’s runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

解题思路

注意:要用二分查找。既然有部分数组被翻转了,找到被翻转的数据(叫做divideIndex),就可以确定target在哪个部分,用二分查找即可。
比如 Example 1: [4,5,6,7,0,1,2],

  1. 找到分割的数据0,index = 4;
    判断 nums[index] 刚好等于 0, 直接return index.
    如果不等于,比如Example 3, target = 3, 跟nums[lastIndex]比较。
  2. 发现3 > 2, 所以,数据在范围[0, divideIndex - 1]区间查找.
  3. 最后如果小于,发现3 < ?, 数据在范围[divideIndex + 1, lastIndex] 中查找。

注意:要考虑到边界的问题,比如数组是空的情况,直接返回-1.

代码如下:

public int search(int[] nums, int target) {// check edgeif (nums == null || nums.length == 0) {return -1;}// find the divide indexint divideIndex = findDividIndex(nums);if (target == nums[divideIndex]) {return divideIndex;}int lastIndex = nums.length - 1;int beginIndex = target > nums[lastIndex] ? 0 : divideIndex;int endIndex = target > nums[lastIndex] ? divideIndex : lastIndex;while (beginIndex <= endIndex) {int midIndex = beginIndex + ((endIndex - beginIndex) >> 1);if (target == nums[midIndex]) {return midIndex;} else if (target > nums[midIndex]) {beginIndex = midIndex + 1;} else {endIndex = midIndex - 1;}}return -1;}private int findDividIndex(int[] nums) {int from = 0;int to = nums.length - 1;while (from < to) {int mid = from + ((to - from) >> 1);if (nums[mid] > nums[to]) {from = mid + 1;} else {to = mid;}}return from;}

代码下载:

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/binarysearch/SearchInRotatedSortedArray.java

算法:Search in Rotated Sorted Array(搜索部分顺序被翻转的数组)相关推荐

  1. python旋转排序数组_LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现...

    题目描述: python实现Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...

  2. LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索

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

  3. [算法题] Search in Rotated Sorted Array ii

    题目内容 题目来源:LeetCode Suppose an array sorted in ascending order is rotated at some pivot unknown to yo ...

  4. 81. Search in Rotated Sorted Array II

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

  5. 【leetcode】Search in Rotated Sorted Array II(middle)☆

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

  6. LeetCode Search in Rotated Sorted Array II

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

  7. 62. Search in Rotated Sorted Array【medium】

    62. Search in Rotated Sorted Array[medium] Suppose a sorted array is rotated at some pivot unknown t ...

  8. leetcode 81 Search in Rotated Sorted Array II ----- java

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

  9. Search in Rotated Sorted Array II

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

  10. LeetCode Online Judge 题目C# 练习 - Search in Rotated Sorted Array II

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

最新文章

  1. IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上)...
  2. linux磁盘空间不足,但是使用df却发现磁盘空间至少有一半的空间没有使用
  3. 支持向量机SVM算法原理
  4. IOS和Android音频开发总结
  5. 通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现
  6. LoadRunner 使用虚拟IP测试流程
  7. grdraw用法 lisp_AutoCAD 2000 Visual LISP开发
  8. delphi报列表索引越界怎么处理_深入了解散列表
  9. hadoop学习使用
  10. SQL Server 数据库之连接查询
  11. java 句柄无效_c# – 通过java运行.net控制台时“句柄无效”
  12. 阿里云Docker仓库
  13. 电脑蓝屏怎么解决0x0000007b,解决电脑蓝屏问题
  14. 使用微PE工具箱安装Win10系统步骤
  15. PCL库学习笔记——使用变换矩阵变换点云
  16. MongoDB系列六(聚合).
  17. Ubuntu 10.10安装配置指南Ubuntu 11.10 图形安装教程
  18. 超微服务器主板bios装系统,超微主板phoenixbios设置方法
  19. 有哪些性价比高的照明品牌?性价比最高的灯具品牌
  20. 程序员狂怒:薪水被应届生倒挂了,很不爽,天王老子也别想留住我!

热门文章

  1. 外包以小时计算金额的费用_全了!各大税种的计算公式,建议收藏!
  2. BZOJ3925: [Zjoi2015]地震后的幻想乡
  3. P1379 八数码难题
  4. ccpcfinal总结
  5. 多路复用输入/输出 ---- select
  6. 黑幕背后的Autorelease
  7. 博弈论——威佐夫博弈 Wythoff Game
  8. 数据库习题(填空题一)
  9. 小知识--电脑隐藏文件
  10. psm倾向得分匹配法举例_倾向得分匹配法的详细解读