博客
关于我
(LeetCode)Java 求解搜索旋转排序数组
阅读量:349 次
发布时间: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/

你可能感兴趣的文章
【△重点△】LeetCode - 4. 寻找两个正序数组的中位数——二分查找
查看>>
LeetCode - 5. 最长回文子串——字符串、动态规划
查看>>
全局锁和表锁 :给表加个字段怎么有这么多阻碍?
查看>>
事务到底是隔离的还是不隔离的?
查看>>
@Import注解---导入资源
查看>>
解决ubuntu在虚拟机(VMware)环境下不能联网的问题
查看>>
二分查找与插入排序的结合使用
查看>>
892 三维形体的表面积(分析)
查看>>
40. 组合总和 II(dfs、set去重)
查看>>
16 最接近的三数之和(排序、双指针)
查看>>
279 完全平方数(bfs)
查看>>
410 分割数组的最大值(二分查找、动态规划)
查看>>
875 爱吃香蕉的珂珂(二分查找)
查看>>
450 删除二叉搜索树中的节点(递归删除节点)
查看>>
桌面图标的自动排列图标
查看>>
第十一届蓝桥杯python组第二场省赛-数字三角形
查看>>
数字三角形的无返回值的深度优先搜索解法
查看>>
完全背包问题的简化思路
查看>>
Jquery添加元素
查看>>
Jquery使用需要下载的文件
查看>>