
(LeetCode)Java 求解搜索旋转排序数组
发布日期:2021-05-07 19:48:52
浏览次数:9
分类:技术文章
本文共 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; }}
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月09日 08时40分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vue中接收后台的图片验证码并显示
2019-03-04
springboot入门(1)---整合MyBatis
2019-03-04
Vue入门学习笔记(1)
2019-03-04
前端入门经验——页面布局
2019-03-04
ECharts——双向柱状图
2019-03-04
Vue——引进bootstrap
2019-03-04
Vue——引进ivew
2019-03-04
趣谈win10常用快捷键
2019-03-04
趣谈文件扩展名和隐藏文件
2019-03-04
追梦App系列博客——第五次例会总结
2019-03-04
大二数据结构(图的深度遍历的 非递归算法)
2019-03-04
数学建模(NO.18灰色预测)
2019-03-04
数学建模更新12(数学线性规划模型1)
2019-03-04
数学建模更新12(多目标规划)
2019-03-04
Java入门笔记(第三章 类与对象之static静态用法)
2019-03-04
Android,SharedPreferences的使用
2019-03-04
(一)Xshell中给Ubuntu20.04服务器安装mysql并修改密码
2019-03-04
Android中使用ViewPager和Fragment实现底部导航栏
2019-03-04
JAVA_方法的使用(方法重载、方法递归)
2019-03-04
VLAN与Trunk的原理及配置
2019-03-04