1. 程式人生 > >[leetcode ]Search in Rotated Sorted Array

[leetcode ]Search in Rotated Sorted Array

題目: Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 
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.

思路: 二分查詢,

需要先判斷是那種情況,然後針對兩種情況分別處理:

1 first <mid   4 5 6 7 8 0 1 2 3.

2 first > mid   6 7 8 0 1 2 3 4 5.

Java 程式碼:

	//二分查詢
	public static int binarySearch(int[] data, int target){				
		int first = 0;
		int last = data.length - 1; 		
		int mid = (first + last )/2;		
		while(first != last){
			if(data[mid] == target)
				return mid;			
			if(data[first] < data[mid] )   //e.x. 4 5 6 7 8 0 1 2 3.
			 {				
				if(data[first]< target && target< data[mid]) //left
				{					
					last = mid; 
				}else{					
					first= mid+1;
				}				
			}else  {  						//e.x. 6 7 8 0 1 2 3 4 5.				
				if(data[mid]< target && target< data[last])  //right
				{
					first= mid+1;					
				}else{					
					last = mid; 
				}
			}			
			mid = (first+ last)/2;   //更新mid的值
		}
		
		return -1 ; 
	}
	

更進一步:

Follow up for ”Search in Rotated Sorted Array”: What if duplicates are allowed?

Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.

考慮first和mid值相等的情況

public static int binarySearchForDuplicated(int[] data, int target){				
		int first = 0;
		int last = data.length - 1; 		
		int mid = (first + last )/2;		
		while(first != last){
			if(data[mid] == target)
				return mid;			
			if(data[first] < data[mid] )   //e.x. 1 2 3 0 1  
			 {				
				if(data[first]<= target && target<= data[mid]) //left
				{					
					last = mid; 
				}else{					
					first= mid+1;
				}				
			}else  if(data[first] > data[mid] )  {  						 //e.x. 1 2 3 0 1 1 1			
				if(data[mid]<= target && target<= data[last])  //right
				{
					first= mid+1;					
				}else{					
					last = mid; 
				}
			}else{ //data[first] == data[mid]
				
				first ++ ; 
			}	
			mid = (first+ last)/2;   //更新mid的值
		}
		
		return -1 ; 
	}