42. Search in Rotated Sorted Array II
Topic :
binary search
Difficulty :
medium
Problem Link :
problem statement
There is an integer array nums
sorted in non-decreasing order (not necessarily with distinct values).
Before being passed to your function, nums
is rotated at an unknown pivot index k
(0 <= k < nums.length
) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(0-indexed). For example, [0,1,2,4,4,4,5,6,6,7]
might be rotated at pivot index 5
and become [4,5,6,6,7,0,1,2,4,4]
.
Given the array nums
after the rotation and an integer target
, return true
if target
is in nums
, or false
if it is not in nums
.
You must decrease the overall operation steps as much as possible.
Example 1:
Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true
Example 2:
Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false
Constraints:
1 <= nums.length <= 5000
-104 <= nums[i] <= 104
nums
is guaranteed to be rotated at some pivot.-104 <= target <= 104
solution
import java.io.*;
import java.util.*;
class Search_An_Element_In_A_Sorted_and_Rotated_Array_II
{
public static void main (String args[])
{
int nums[]={4,5,6,7,0,1,2};
int key=0;
System.out.println(search(nums,key));
}
static boolean search(int[] nums, int target) {
int low=0;
int high=nums.length-1;
while(low<=high)
{
int mid=low+(high-low)/2;
if(nums[mid]==target)
return true;
if(nums[mid]==nums[low] && nums[mid]==nums[high]) // cannot determine if part of left sorted or right sorted
{
high--;
low++;
}
else if(nums[mid]>=nums[low])// left sorted part
{
if(target>=nums[low] && target<nums[mid])
high=mid-1;
else
low=mid+1;
}
else if (nums[mid]<nums[low])// right sorted part
{
if(target>nums[mid] && target<=nums[high])
low=mid+1;
else
high=mid-1;
}
}
return false;
}
}