【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 ...
随机推荐
- js实现原生Ajax的封装及ajax原理详解
原理及概念 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指可以通过服务器语言结合数 ...
- oc3--类方法1
// // main.m // 第一个OC类-方法 #import <Foundation/Foundation.h> /* C语言中函数分为声明和实现,OC中定义类, 就是在写类的声明和 ...
- 每天一个linux命令(01):ifconfig命令
许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...
- CSS Flexbox 弹性盒子模型
CSS Flexbox 弹性盒子模型 设置元素样式为 display: flex 或 display: inline-flex, 让元素变成flex容器, 从而可以通过flex模式布局它的子元素. f ...
- 使用C#正则表达式获取必应每日图片地址
微软的Bing搜索引擎首页每天都会提供了一些有趣的图片,下面使用正则表达式获取图片的地址,不管是在手机app还是在网站上都是很好的图片素材,而且每天更新,非常不错. 首先访问微软的API,该地址返回的 ...
- Codeforces Round #454
Masha and Bears Tic-Tac-Toe Shockers Seating of Students Party Power Tower Reverses
- Django学习笔记----settings and database_based App demo
原文参考docs.djangoproject.com, what can manage.py utility do? find here. 1.Database Setup 编辑settings.py ...
- 使用Windows上Eclipse远程调试Linux上的Hadoop
一.设置Eclipse运行用户 如果以与Hadoop运行用户名(比如grid)不同的用户运行Eclipse,则无法对Hadoop运行用户所属的文件进行管理,运行Map/Reduce程序也会报& ...
- WCF - NetCtP 双工错误列表
1. 在服务 Transfer 实现的协定列表中找不到协定名称 "IMetadataExchange" 将 ServiceMetadataBehavior 添加到配置文件或直接添加 ...
- 几个书本上不常见到的C语言函数
函数名称:getcwd #include <unistd.h> char *getcwd(char *buf, size_t size); 作用:把当前目录的绝对地址保存到 buf 中,b ...