博客
关于我
(LeetCode)Java 求解搜索旋转排序数组
阅读量:348 次
发布时间:2019-03-04

本文共 2106 字,大约阅读时间需要 7 分钟。

文章目录

一、题目

升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。

请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

在这里插入图片描述


解析

该题可以使用常规的左右指针,左右夹逼找到target。

也可以采用二分搜索的思路:

  • 由于该数组是旋转后的数组,所以首先需要确定 中间值 mid 在左部还是右部,然后再调整左右边界
  • 如果在左部例如:[3,4,5,6,7,1,2]
  • 如果在右部例如:[5,6,7,1,2,3,4]

二、代码

class Solution {       public int search(int[] nums, int target) {           if(target>nums[nums.length-1] && target < nums[0]){               return -1;        }        int left = 0;        int right = nums.length-1;        while(left<=right){               int mid = (left+right)/2;            if(nums[mid]==target){                   return mid;            }            //中间值在左边            if(nums[mid]>=nums[left]){                   //left 到 mid 是递增的                if(target>=nums[left] && target<=nums[mid]){                       right = mid-1;                }else{                       left = mid +1;                }            }else{                   //mid 到 right 是递增的                if(target>=nums[mid] && target<=nums[right]){                       left = mid +1;                }else{                       right = mid -1;                }            }        }        return -1;    }}

三、总结

本题中关键在于需要根据 中间值,分段考虑来确定左右的边界

同时注意等于号别忘加上,将等于号归于大于或小于中的情况

在这里插入图片描述

四、补充

刷过

之后,发现对于二分查找,打算以后都使用 while(left<right),排除元素找符合的目标的方法,

所以对代码进行了改写,大体思路没有变,只是将 nums[mid]==target,归于了左半部。也就是此时的两段区间是 [left,mid],[mid+1,right],所以对应的mid 是向下取整

class Solution {       public int search(int[] nums, int target) {           if(target>nums[nums.length-1] && target < nums[0]){               return -1;        }        int left = 0;        int right = nums.length-1;        while(left
=nums[left]){ if(target>=nums[left] && target<=nums[mid]){ right = mid; }else{ left = mid +1; } }else{ if(target>nums[mid] && target<=nums[right]){ left = mid +1; }else{ right = mid; } } } return nums[left]==target ? left:-1; }}

转载地址:http://yvar.baihongyu.com/

你可能感兴趣的文章
剑指 Offer 28. 对称的二叉树
查看>>
力扣239. 滑动窗口最大值
查看>>