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: trueExample 2:
Input: nums = [2,5,6,0,0,1,2], target = 3
Output: falseConstraints:
1 <= nums.length <= 5000-104 <= nums[i] <= 104numsis 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;
}
}