Search in Rotated Sorted Array, 查找反转有序序列。利用二分查找的思想。反转序列。...

问题描述:一个有序序列经过反转,得到一个新的序列,查找新序列的某个元素。12345->45123。

算法思想:利用二分查找的思想,都是把要找的目标元素限制在一个小范围的有序序列中。这个题和二分查找的区别是,序列经过mid拆分后,是一个非连续的序列。特别要注意target的上下限问题。因为是非连续,所以要考虑上下限,而二分查找,序列式连续的,只用考虑单限。有递归算法和迭代算法。

 

递归算法:

 1 public int search(int[] nums, int target) 
 2     {
 3         return binarySearch(nums, 0, nums.length - 1, target);
 4     }
 5     //递归方法
 6     public int binarySearch(int[] nums, int left, int right, int target)
 7     {
 8         //不要忘了这个边界条件。
 9         if(left > right)
10         {
11             return -1;
12         }
13         int mid = (left + right)/2;
14         if(target == nums[mid])
15         {
16             return mid;
17         }
18         if(nums[left] <= nums[mid])//做连续,要包含"="的情况,否则出错。
19         {
20             if(target >= nums[left] && target < nums[mid])//target上下限都要有
21             {
22                 return binarySearch(nums, left, mid - 1, target);//记得return
23             }
24             else
25             {
26                 return binarySearch(nums, mid + 1, right, target);
27             }
28         }
29         else
30         {
31             if(target > nums[mid] && target <= nums[right])
32             {
33                 return binarySearch(nums, mid + 1, right, target);
34             }
35             else
36             {
37                 return binarySearch(nums, left, mid - 1, target);
38             }
39         }
40     }

 

迭代算法:

//迭代方法
    public int binarySearch2(int[] nums, int left, int right, int target)
    {
        
        while(left <= right)
        {
            int mid = (left + right)/2;
            if(target == nums[mid])
            {
                return mid;
            }
            
            if(nums[left] <= nums[mid]) //左连续,所以要包含=的情况。否则出错。
            {
                if(target >= nums[left] && target < nums[mid])
                {
                    right = mid - 1;
                }
                else
                {
                    left = mid + 1;
                }
            }
            else
            {
                if(target > nums[mid] && target <= nums[right])
                {
                    left = mid + 1;
                }
                else
                {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }

 

转载于:https://www.cnblogs.com/masterlibin/p/5571382.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值