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 7might become4 5 6 7 0 1 2).

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.

 

题意:

假设一个排序后的数组在某个未知的轴上旋转。

(即,0 1 2 4 5 6 7 可能变成:4 5 6 7 0 1 2)

给定要搜索的目标值,如果在数组中找到,返回它的索引,否则返回-1。

您可以假设数组中不存在副本。

 

解决思路:

暴力搜索法,直接进行比较取索引就行

/*
	 * 暴力搜索法
	 */
	public static int search2(int[] A, int target) {
		if(A == null || A.length <= 0) {
			return -1;
		}
		int index = 0;
		for(int i = 0 ;i < A.length ;i++) {
			if(A[i] == target) {
				index = i;
			}
		}
		return index;
	}
	

 

下面是折半查找的方法

因为这里发生的旋转,所以数组的序列发生了改变,但中点是不会变的,也就是我们找出左右两边是从小到大还是从大到小就可以解决问题。那我们怎么判断是从小到大,还是从大到小呢,这里可以取中点和旁边的数字比较大小就可以得出两边的序列是升序还是降序了。所以所以我们可以分为3种情况讨论:

第一种是 直接命中的,我们直接返回mid就行

第二种是A[mid] < A[high] 表明 这个 mid-high是升序的,既然是升序的,那我们可以判断目标值是否在A[mid]-A[high]里面,是就low = mid +1,不是就high = mid -1;这里就和折半的思路是差不多的

第三种也就是A[mid] > A[high],表明这个mid - low是降序的,也就是low-mid有序。那我们可以判断目标值是否在A[low]-A[mid]里面,在high = mid -1;不在 low = mid -1;

 

Java代码表示:


	public static int search(int[] A, int target) {
		if(A == null || A.length <= 0) {
			return -1;
		}
        int low = 0;
        int high = A.length-1;
        while(low <= high) {
        	int mid = (low + high)/2;
        	//在中间的情况
        	if(A[mid] == target) {
        		return mid;
        	}
        	//mid-high为升序状态
        	if(A[mid] < A[high]) {
        		if(target > A[mid] && target <= A[high]) {
        			low = mid + 1;
        		}
        		else {
        			high = mid -1;
        		}
        	}
        	//low - mid是有序的
        	else {
        		if(target >= A[low] && target < A[mid] ) {
        			high = mid - 1;
        		}
        		else {
        			low = mid + 1;
        		}
        	}
        }
        
        return -1;
    }
	

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值