Search in Rotated Sorted Array - LeetCode

本文介绍了一种用于在已排序并旋转的数组中搜索目标值的算法,包括查找分界点和进行二分搜索的过程。通过实例代码演示了实现步骤,并提供了详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 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.

思路:先查找分界点,再进行二分。

先推荐一篇很好的博文: http://blog.youkuaiyun.com/pickless/article/details/9191075

以下是我AC的代码:

public class Solution {
    public int search(int[] A, int target) {
		if(A == null|| A.length == 0)
			return -1;
        int start = 0;
        int end = A.length - 1;
        int index = 0;
        int sign = 0;
        int result = -1;
        for(int i = 0; i < A.length - 1; i++){
        //	System.out.println("start:" + start+"end:"+end);
        	
        	if(A[start] == target){
                result = start;
            }
            else if(A[end] == target){
                result = end;
            }
            else if(A[start] > A[start + 1]){
                index = start;
                sign = 2;
                break;
                }
            else if(A[end] < A[end - 1]){
                index = end;
                sign = 1;
                break;
            }
            else if(start == end || start + 1 == end)
            	{
            	    //System.out.println("Here");
        		return -1;}
            else{
            start ++;
            end --;
            }
        	
        }
        if(result > 0)
        	return result;
        else if(sign == 2){
        start = start + 1;
        //end = index;
        //System.out.println("Here");
        return halfsearch(A, start, end, target);
        }
        else //if(sign == 1)
        	{
        //start = index;
        end = end - 1;
     //   System.out.println("Here");
      //  System.out.println(start);
      //  System.out.println(end);
        return halfsearch(A, start, end, target);
        }
    }
     public int halfsearch(int[] A, int s, int e, int target) {
	        if (A == null ) {
	            return -1;
	        }
	        else if(A[s] == target)
	        	return s;
	        else if(s >= e)
	        	return -1;

	        int start = s;
	        int end = e;
	        int mid;
	     //   System.out.println(s);
	      //  System.out.println(e);
	        /* [1, 2] */
	        while (start + 1 < end) {
	            mid = start + (end - start) / 2;
	            if (A[mid] == target) {
	                return mid;
	            } else if (A[mid] < target) {
	                start = mid;
	            } else {
	                end = mid;
	            }
	        }
	        
	        if (A[start] == target) {
	            return start;
	        }
	        if (A[end] == target) {
	            return end;
	        }
	        
	        return -1;
	    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值