Leetcode刷题记—— 81. Search in Rotated Sorted Array II(在翻转数组中查找2)
2017-01-05 13:32
621 查看
一、题目叙述:
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e.,
Write a function to determine if a given target is in the array.
The array may contain duplicates.
Subscribe to see which companies asked this question
给定一个按某个轴翻转了顺序的排序数组,求给定值是否在数组中,在返回true,若不存在,返回false。(要考虑存在重复元素)
二、解题思路:
本题与33题类似,只是要考虑到重复元素的问题。
首先,将问题抽象化,对于一个区间[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.如果a[l] == a[r] ,此时不便判断最小值在何处,但可以肯定最小的值必定不是位于l的位置,故l++;
3、找到最小数的坐标,我们就可以像正常的二分查找方式一样对数组进行查找搜索.
三、源码:
public class Solution
{
public boolean search(int[] nums, int target)
{
int l = 0;
int r = nums.length - 1;
while (l < r)
{
if (nums[l] < nums[r]) r = l;
else if (nums[l] > nums[r])
{
int mid = l + (r - l) / 2;
if (nums[mid] >= nums[l]) l = mid + 1;
else if (nums[mid] < nums[l]) r = mid;
}
else
l++;
}
System.out.print(l);
return find(nums, target, l);
}
public boolean 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 true;
else if (nums[temp] > target) r1 = mid - 1;
else l1 = mid + 1;
}
return false;
}
public static void main(String args[])
{
int[] nums = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int target = 2;
// for (int i = 0; i < nums.length; i ++)
// if (nums[i] == 2)
// System.out.println(i);
Solution solution = new Solution();
System.out.println(solution.search(nums, target));
}
}
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e.,
0 1 2 4 5 6 7might become
4 5 6 7 0 1 2).
Write a function to determine if a given target is in the array.
The array may contain duplicates.
Subscribe to see which companies asked this question
给定一个按某个轴翻转了顺序的排序数组,求给定值是否在数组中,在返回true,若不存在,返回false。(要考虑存在重复元素)
二、解题思路:
本题与33题类似,只是要考虑到重复元素的问题。
首先,将问题抽象化,对于一个区间[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.如果a[l] == a[r] ,此时不便判断最小值在何处,但可以肯定最小的值必定不是位于l的位置,故l++;
3、找到最小数的坐标,我们就可以像正常的二分查找方式一样对数组进行查找搜索.
三、源码:
public class Solution
{
public boolean search(int[] nums, int target)
{
int l = 0;
int r = nums.length - 1;
while (l < r)
{
if (nums[l] < nums[r]) r = l;
else if (nums[l] > nums[r])
{
int mid = l + (r - l) / 2;
if (nums[mid] >= nums[l]) l = mid + 1;
else if (nums[mid] < nums[l]) r = mid;
}
else
l++;
}
System.out.print(l);
return find(nums, target, l);
}
public boolean 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 true;
else if (nums[temp] > target) r1 = mid - 1;
else l1 = mid + 1;
}
return false;
}
public static void main(String args[])
{
int[] nums = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int target = 2;
// for (int i = 0; i < nums.length; i ++)
// if (nums[i] == 2)
// System.out.println(i);
Solution solution = new Solution();
System.out.println(solution.search(nums, target));
}
}
相关文章推荐
- leetcode 81. Search in Rotated Sorted Array II 旋转数组查找+二分查找
- leetcode 81. Search in Rotated Sorted Array II-旋转数组|二分查找
- LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
- Leetcode刷题记—— 33. Search in Rotated Sorted Array(在翻转顺序的数组里查找)
- leetcode 题解:Search in Rotated Sorted Array II (旋转已排序数组查找2)
- leetcode 刷题之路 35 Search in Rotated Sorted Array II (旋转排序数组查找终极版)
- Leetcode 81. Search in Rotated Sorted Array II 旋转数组查询2 解题报告
- leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法
- leetcode_81——Search in Rotated Sorted Array II(二分查找)
- LeetCode @ Search in Rotated Sorted ArrayII 旋转数组查找II
- LeetCode 81. Search in Rotated Sorted Array II(搜索旋转的数组)
- LeetCode-Search in Rotated Sorted Array II-在旋转数组中搜索-二分查找
- [leetcode]【数组】81. Search in Rotated Sorted Array II
- LeetCode OJ 之 Search in Rotated Sorted Array II (有序数组翻转后的查找 - 二)
- [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II
- LeetCode OJ:Search in Rotated Sorted Array II(翻转排序数组的查找)
- leetcode-81-Search in Rotated Sorted Array II 查找
- leetcode[81]Search in Rotated Sorted Array II
- leetcode 81. Search in Rotated Sorted Array II
- 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)