已序数组旋转后找target

已序数组旋转后找target

题目: 旋转后的已序数组【4 6 8 9 0 2 3】找target

思路

因为是已序后旋转,所以是一个类似已序的数组,在里面找target,肯定是二分查找了
但是要注意很多细节

方法1

情况1:

4 6 8 9 0 2 3
^     ^     ^
f    mid    l
  ^
target
arr[first] <= target && target < arr[mid]

情况2:

4 6 8 9 0 2 3
^         ^ ^
f       mid l
    ^
  target
arr[first] <= target && target > arr[mid] && arr[first] > arr[mid]

情况3:

4 6 8 9 0 2 3
^         ^ ^
f       mid l
        ^
      target
arr[first] > target && target < arr[mid] && arr[first] > arr[mid]

code

// 4 5 6 7 0 1 2 3
public class Search{
    
    

	public static void main(String args[]){
    
    
		int[] arr = {
    
    5,6,7,9,0,1,2,3};
		System.out.println(search(arr,9));
		System.out.println(search(arr,5));
		System.out.println(search(arr,6));
		System.out.println(search(arr,7));
		System.out.println(search(arr,0));
		System.out.println(search(arr,1));
		System.out.println(search(arr,2));
		System.out.println(search(arr,3));
		
		
		System.out.println(search(arr,4));
		System.out.println(search(arr,8));
		System.out.println(search(arr,-9));
		System.out.println("==================");
	}
	
	public static int search(int[] arr, int target){
    
    
		if(arr == null){
    
    
			return -1;
		}
		int first = 0;
		int last = arr.length - 1;

		while(first <= last){
    
    
			int mid = first + (last - first) / 2;
			if(arr[mid] == target){
    
    
				return mid;
			}else if((arr[first] <= target && target < arr[mid])
				|| (arr[first] <= target && target > arr[mid] && arr[first] > arr[mid])
				|| (arr[first] > target && target < arr[mid] && arr[first] > arr[mid])){
    
    
				last = mid - 1;
			}else{
    
    
				first = mid + 1;
			}
		}
		return -1;
	}
}

方法2

其实不论mid在哪里,一定都有一边是有序的

4 6 8 9 0 2 3
^     ^     ^
f    mid    l
已序
f - mid
4 6 8 9 0 2 3
^       ^   ^
f      mid  l
已序
mid - l

// 4 5 6 7 0 1 2 3
public class Search{
    
    

	public static void main(String args[]){
    
    
		int[] arr = {
    
    5,6,7,9,0,1,2,3};
		
		
		System.out.println(search2(arr,9));
		System.out.println(search2(arr,5));
		System.out.println(search2(arr,6));
		System.out.println(search2(arr,7));
		System.out.println(search2(arr,0));
		System.out.println(search2(arr,1));
		System.out.println(search2(arr,2));
		System.out.println(search2(arr,3));
								  
								  
		System.out.println(search2(arr,4));
		System.out.println(search2(arr,8));
		System.out.println(search2(arr,-9));
	}
	
	public static int search2(int[] arr, int target){
    
    
		if(arr == null){
    
    
			return -1;
		}
		int first = 0;
		int last = arr.length - 1;

		while(first <= last){
    
    
			int mid = first + (last - first) / 2;
			if(arr[mid] == target){
    
    
				return mid;
			}else{
    
    				
				if(arr[mid] > arr[first]){
    
    
					//前面有序
					if(arr[mid] > target && arr[first] <= target){
    
    
						last = mid - 1;
					}else{
    
    
						first = mid + 1;
					}
				}else{
    
    
					//后面有序
					if(arr[mid] < target && arr[last] >= target){
    
    
						first = mid + 1;
					}else{
    
    
						last = mid - 1;
					}
				}
			}
		}
		return -1;
	}
}

猜你喜欢

转载自blog.csdn.net/xiaolixi199311/article/details/113746039