package com.interview.binarysearch; /** * @author Tushar Roy * Date 01/22/17 * * Search in sorted and rotated array. In one version duplicate is not allowed and * in another version duplicate is allowed. * * Time complexity with no duplicate - O(logn) * Time complexity with duplicates - O(n) * * https://leetcode.com/problems/search-in-rotated-sorted-array/ * https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ */ public class SortedAndRotatedArraySearch { /** * Duplicates are not allowed in arr. */ public int search(int arr[],int search){ int low =0; int high = arr.length-1; while(low <= high){ int mid = (low + high)/2; if(arr[mid] == search){ return mid; } if(arr[mid] < arr[high]){ if(arr[mid] < search && search <= arr[high]){ low = mid+1; }else{ high = mid-1; } }else{ if(search >= arr[low] && search < arr[mid]){ high = mid-1; }else{ low = mid+1; } } } return -1; } /** * Duplicates are allowed in arr. */ public boolean searchWithDuplicates(int[] arr, int search) { int low =0; int high = arr.length-1; while(low <= high){ int mid = (low + high)/2; if(arr[mid] == search) { return true; } //if low is same as mid then increment low. if (arr[mid] == arr[low]) { low++; } else if (arr[mid] == arr[high]) { //if high is same as mid then decrement high. high--; } else if (arr[mid] < arr[high]) { if(arr[mid] < search && search <= arr[high]) { low = mid + 1; } else { high = mid - 1; } } else { if(search >= arr[low] && search < arr[mid]) { high = mid - 1; } else { low = mid + 1; } } } return false; } public static void main(String args[]){ SortedAndRotatedArraySearch ras = new SortedAndRotatedArraySearch(); int arr1[] = {1,2,5,6,7,8,11,21}; System.out.print(ras.search(arr1, 1)); System.out.print(ras.search(arr1, 5)); System.out.print(ras.search(arr1, 22)); System.out.println(); int arr2[] = {18,21,1,2,5,6,7,8,10,15}; System.out.print(ras.search(arr2, 1)); System.out.print(ras.search(arr2, 5)); System.out.print(ras.search(arr2, 10)); System.out.print(ras.search(arr2, 14)); System.out.println(); int arr3[] = {7,8,15,17,18,21,1,2,5,6}; System.out.print(ras.search(arr3, 1)); System.out.print(ras.search(arr3, 5)); System.out.print(ras.search(arr3, 10)); System.out.print(ras.search(arr3, 7)); System.out.print(ras.search(arr3, 6)); System.out.print(ras.search(arr3, 16)); } }