博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】...
阅读量:6297 次
发布时间:2019-06-22

本文共 2738 字,大约阅读时间需要 9 分钟。


原题

  Suppose a sorted array 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.

题目大意

 假设一个排序的数组以一个未知的的枢轴旋转。(即,0 1 2 4 5 6 7可能成为4 5 6 7 0 1 2)。

  给定一个目标值,在数组中搜寻。

假设存在就返回其相应的下标。否则返回-1。

  假设数组中不存在反复值。

 

解题思路

  先在数组中找到最小元素相应的下标,假设下标为0说明整个数组是序的。假设不是说明数组被分成两个有序的区间,推断要查找的元素是那一个有序区间中,然后进行查找。

代码实现

算法实现类

public class Solution {
public int search(int[] nums, int target) { if (nums != null && nums.length > 0) { // 找最小元素相应的下标 int minIndex = searchMinIndex(nums, 0, nums.length - 1); // 整个数组全局有序 if (minIndex == 0) { return binarySearch(nums, 0, nums.length - 1, target); } // 有两个局部有序区间, 如 4 5 6 7 8 9 0 1 2 3 else { // 恬好和后一个有序区间的最后一个元素相等,返回相应的下标 if (nums[nums.length - 1] == target) { return nums.length -1; } // target可能在后一个有序区间中 else if (nums[nums.length - 1] > target) { return binarySearch(nums, minIndex, nums.length - 1, target); } // target可能是前一个有序区间中 else { return binarySearch(nums, 0, minIndex -1, target); } } } return -1; } /** * 二分搜索 * * @param nums 数组 * @param start 起始位置 * @param end 结束位置 * @param target 搜索目标 * @return 匹配元素的下标 */ public int binarySearch(int[] nums, int start, int end, int target) { int mid; while (start <= end) { mid = start + ((end - start) >> 1); if (nums[mid] == target) { return mid; } else if (nums[mid] > target) { end = mid - 1; } else { start = mid + 1; } } return -1; } /** * 找最小元素的下标 * * @param nums 数组 * @param start 起始位置 * @param end 结束位置 * @return 最小元素的下标 */ public int searchMinIndex(int[] nums, int start, int end) { int mid; while (start < end) { mid = start + ((end - start) >> 1); // 后一个数比前个数小就找到了 if (nums[mid] > nums[mid + 1]) { return mid + 1; } // 说明中间值在第一个有序的数组中 else if (nums[mid] > nums[start]) { start = mid; } // 说明中间值在第二个有序的数组中 else { end = mid; } } // 说明整个数组是有序的 return 0; }}

评測结果

  点击图片。鼠标不释放,拖动一段位置。释放后在新的窗体中查看完整图片。

这里写图片描写叙述

特别说明

欢迎转载。转载请注明出处【】

你可能感兴趣的文章
MySQL常见错误代码及代码说明
查看>>
Android App定位和规避内存泄露方法研究
查看>>
移动平台还有哪些创业机会
查看>>
ansible之fetch模块
查看>>
ftp虚拟账户配置
查看>>
sql server 2008数据复制
查看>>
EIGRP的AD(管理距离)、AD(宣告距离)、FD(可行距离)
查看>>
准爸爸日记——20120502海淀妇幼建档续
查看>>
实战Cacti网络监控(1)——基础安装配置
查看>>
浅谈Oracle Online redo log
查看>>
Mysql数据库主从搭建
查看>>
我的友情链接
查看>>
我的软考大事记(北京市)
查看>>
从上往下打印二叉树
查看>>
使用Sublime Text 3作为Python编辑器有关中文问题
查看>>
虚函数
查看>>
5.1Python函数(一)
查看>>
Linux命令学习记录(六)
查看>>
P1984 [SDOI2008]烧水问题
查看>>
ntp服务器搭建
查看>>