【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】
【033-Search in Rotated Sorted Array(在旋转数组中搜索)】
【LeetCode-面试算法经典-Java实现】【全部题目文件夹索引】
原题
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;
}
}
评測结果
点击图片。鼠标不释放,拖动一段位置。释放后在新的窗体中查看完整图片。
特别说明
欢迎转载。转载请注明出处【http://blog.csdn.net/derrantcm/article/details/47064941】
【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】的更多相关文章
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- 【LeetCode】Find Minimum in Rotated Sorted Array 在旋转数组中找最小数
Add Date 2014-10-15 Find Minimum in Rotated Sorted Array Suppose a sorted array is rotated at some p ...
- [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)
指数:[LeetCode] Leetcode 解决问题的指数 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 033. ...
- [LeetCode]题解(python):081 - Search in Rotated Sorted Array II
题目来源 https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ Follow up for "Search in ...
- [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索
11.3 Given a sorted array of n integers that has been rotated an unknown number of times, write code ...
- LeetCode 033 Search in Rotated Sorted Array
题目要求:Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you b ...
- [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 ...
- [leetcode]81. Search in Rotated Sorted Array II旋转过有序数组里找目标值II(有重)
This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates. 思路 ...
- [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 Search in Rotated Sorted Array 在旋转了的数组中查找
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
随机推荐
- luogu1120 小木棍【数据加强版】 暴力剪枝
题目大意 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.给出每段小木棍的长度,编程帮 ...
- nyoj--635--Oh, my goddess(dfs)
Oh, my goddess 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Shining Knight is the embodiment of justice an ...
- nyoj--491--幸运三角形(dfs)
幸运三角形 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成('+'或者'-'),图形的最上层有n个符号,往下个数依次减一,形成倒置的 ...
- ubuntu系统源的更新
以前没有注意,ubuntu的系统的源原来每次在GUI操作后都会追加在后面而不是覆盖,比如先添加了上海交大的源那么后来如果发现很慢下载不了,而这个包已经在apt-cache里面了,下次如果要instal ...
- FTP协议讲解
FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用.FTP的目标是提高文件的共享性和可靠高效地传送数据. 在传输文件时,FTP 客户端程序先与服务器建立连接 ...
- JavaScript Cookies使用
Cookie 是个存储在客户端(浏览器)记录信息确定用户身份的小文本文件,可以用来跟踪用户当前登陆状态和用户浏览页面的次数,记录用户输入的文本信息,也可以在页面间传递变量,记录用户一些行为. 当浏览器 ...
- (转)shiro权限框架详解01-权限理论介绍
http://blog.csdn.net/facekbook/article/details/54890365 权限管理 本文介绍权限管理的理论和权限管理的一些名词. 介绍权限管理 理解身份认证和授权 ...
- Binary Agents FreeCodeCamp
function binaryAgent(str) { var arr = str.split(" "); var newStr = ""; for(var i ...
- 路飞学城Python-Day180
部署作业 [pythonanywhere]
- Matrix(坑)
https://github.com/florent37/Android-3D-Layout