Leetcode刷题记—— 33. Search in Rotated Sorted Array(在翻转顺序的数组里查找)
来源:互联网 发布:u盘ubuntu分区教程 编辑:程序博客网 时间:2024/06/05 16:20
一、题目叙述:
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.
Subscribe to see which companies asked this question
二、解题思路(参考别人的思路):
本题是二分查找应用的变体,主要难度在思考出方法上。。。
首先,将问题抽象化,对于一个区间[l, r],我们希望能够找到这段区间中最小数的坐标,不妨称为q[l, r],
令 m = (l + r) / 2, 首先我们来看这段区间的构成:
如果 a[l] < a[r],说明这段区间是有序的,容易知道 q[l, r] = l
如果 a[l] > a[r],说明这段区间是由两段有序区间组成的,此时我们分情况讨论:
2.1 如果 a[m] >= a[l],说明 m 处于左侧(即较高)的一段有序区间中,因为最小值一定在较低的有序区间中,我们可以知道 q[l, r] = q[m + 1, r]。
2.2 如果 a[m] < a[l],说明 m 处于右侧(即较低)的一段有序区间中,但因为 a[m] 一定满足 a[m] <= a[r],即[m + 1, r]中的所有元素都不会是最小值,我们可以知道q[l, r] = q[l, m]。
由于在这样的处理中,每次问题的规模都被缩小了一半,所以最终我们一定会遇到一个问题q[l, r]满足l=r,此时我们就可以知道区间中最小数的坐标为l。
3、找到最小数的坐标,我们就可以像正常的二分查找方式一样对数组进行查找搜索,只是在计算得到mid值时稍加计算,以得到真正大小顺序为mid的数组下标,即(mid + l)% nums.length;三、源码:
public class Solution { public int search(int[] nums, int target) { int l = 0; int r = nums.length - 1; while (l < r) { if (nums[l] < nums[r]) r = l; else { int mid = l + (r - l) / 2; if (nums[mid] >= nums[l]) l = mid + 1; else if (nums[mid] < nums[l]) r = mid; } } return find(nums, target, l); } public int find(int[] nums, int target, int l) { int l1 = 0; int r1 = nums.length - 1; while (l1 <= r1) { int mid = l1 + (r1 - l1) / 2; int temp = (l + mid) % nums.length; if (nums[temp] == target) return temp; else if (nums[temp] > target) r1 = mid - 1; else l1 = mid + 1; } return -1; } public static void main(String args[]) { int[] nums = {}; int target = 9; Solution solution = new Solution(); System.out.println(solution.search(nums, target)); }}
- Leetcode刷题记—— 33. Search in Rotated Sorted Array(在翻转顺序的数组里查找)
- Leetcode刷题记—— 81. Search in Rotated Sorted Array II(在翻转数组中查找2)
- LeetCode OJ 之 Search in Rotated Sorted Array (有序数组翻转后的查找)
- [LeetCode刷题记录]Search in Rotated Sorted Array
- LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找
- LeetCode OJ 之 Search in Rotated Sorted Array II (有序数组翻转后的查找 - 二)
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
- Search in Rotated Sorted Array 旋转数组里查找数 @LeetCode
- LeetCode @ Search in Rotated Sorted Array 旋转数组查找
- leetcode—153. Find Minimum in Rotated Sorted Array 在翻转数组寻找最小值
- leetcode---search-in-rotated-sorted-array---查找
- LeetCode | Search in Rotated Sorted Array(在旋转数组中查找)
- Search in Rotated Sorted Array-旋转数组的查找
- leetcode 33. Search in Rotated Sorted Array(二分查找)
- leetcode 33. Search in Rotated Sorted Array 二分查找
- leetcode 33. Search in Rotated Sorted Array (复杂二分查找)
- Leetcode--Search in Rotated Sorted Array(旋转数组的查找)
- 【LeetCode刷题】旋转数组的查找 Search in Rotated Sorted Array
- 等差数列前n项和
- 51单片机作业
- <meta http-equiv="X-UA-Compatible" content="IE=Edge">
- 64. Minimum Path Sum
- androidstudio中外部数据库的导入
- Leetcode刷题记—— 33. Search in Rotated Sorted Array(在翻转顺序的数组里查找)
- 输入一个整数,求该整数的二进制中1的个数,并输出
- Android动画
- 《PCL点云库学习&VS2010(X64)》Part 22 激光雷达点云数据处理相关算法库收集
- 面试题
- Python 之ConfigParser
- latex 中,代码注释含有中文和英文,英文会跑后面的问题。
- 内核字符串与链表
- oracle 游标 调用函数 语法