33.搜索旋转排序数组
就只想到了O(n)的,
想到的二分,
- target<nums[left] 则在右边有序搜索
- target>=nums[left],在左边有序搜素
- 自然是错误的,于是搁置不得了之。
看了题解恍然大悟。
以mid分成左右两个数组。
其中至少一个是有序的,且范围已知
- 如果target在此范围内,二分即可
- 不在此范围内,搜索另一个数组
class Solution {public int search(int[] nums, int target) {return searchHelp(nums,target,0,nums.length-1);}private int searchHelp(int[] nums,int target,int left,int right){if(left>right) return -1;int mid=left+((right-left)>>1);if(nums[mid]==target) return mid;if(mid-1>=left&&nums[left]<=nums[mid-1]){//有序在左边,且目标值在里面if(target>=nums[left]&&target<=nums[mid-1]){right=mid-1;while (left<=right){mid=left+(right-left)/2;if(nums[mid]==target) return mid;if(nums[mid]>target) right=mid-1;else left=mid+1;}}//不在里面,搜索右边无序的。return searchHelp(nums,target,mid+1,right);}else {//有序在右边,且目标在里面if(mid+1<nums.length&&target<=nums[right]&&target>=nums[mid+1]){left=mid+1;while (left<=right){mid=left+(right-left)/2;if(nums[mid]==target) return mid;if(nums[mid]>target) right=mid-1;else left=mid+1;}}return searchHelp(nums,target,left,mid-1);}}
}
还有一种更简洁的写法
class Solution {public int search(int[] nums, int target) {int left=0;int right=nums.length-1;while (left<=right){int mid=left+((right-left)>>1);if(nums[mid]==target) return mid;if(mid-1>=left&&nums[left]<=nums[mid-1]){if(target<=nums[mid-1]&&target>=nums[left]){right=mid-1;}else left=mid+1;}else{if(mid+1<nums.length&&target>=nums[mid+1]&&target<=nums[right]){left=mid+1;} else right=mid-1;}}return -1;}
}
关于判断
if(mid-1>=left&&nums[left]<=nums[mid-1]){nums[left]<=nums[mid-1] 取等号,是为了考虑只有一个数的时候
33.搜索旋转排序数组相关推荐
- LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置
前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...
- LeetCode—33. 搜索旋转排序数组
33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...
- LeetCode 33. 搜索旋转排序数组 golang
33. 搜索旋转排序数组 三个测试用例, 这个题的难度是二分法的左侧条件很难写出来. 4 5 6 0 1 2 3 1 2 3 4 5 6 0 5 1 2 3 4 ( 例如,数组 [0,1,2,4,5, ...
- 数组的合并和升序排列_leetcode 33 搜索旋转排序数组
给你一个升序排列的整数数组 nums ,和一个整数 target . 假设按照升序排序的数组在预先未知的某个点上进行了旋转.(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0 ...
- LeetCode高频题33. 搜索旋转排序数组
LeetCode高频题33. 搜索旋转排序数组 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批A ...
- 【Leetcode】33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- leetcode 33 搜索旋转排序数组 到处是细节的好题
这个题想了想就会做,只是细节真的能卡死人,找了好久的bug.甚至我怀疑我现在的代码可能还有错,只是没例子测出来. 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...
- LeetCode 33. 搜索旋转排序数组(二分查找)
1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- leetcode —— 33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
最新文章
- TS流解析之PAT表格解析
- Go Embed简明教程
- 三十五、数据仓库的设计和应用
- yolo人脸检测数据集_自定义数据集上的Yolo-V5对象检测
- 华为鸿蒙净水机,华为鸿蒙OS 2.0手机版功能抢先曝光
- jsonhelper java_JSON和JAVA的POJO的相互转换
- SecureCRT更改字体
- js高级学习笔记(b站尚硅谷)-10-instanceof
- Ubuntu下安装stlink-v2驱动
- 钉钉微应用调用支付宝JSAPI进行支付
- mp-mtgsig 美团iOS 签名逆向工程分析
- 费希纳定律的推导过程图解
- Gym 100818F	Irrational Roots
- calc() 工作原理
- SQL查询语句、联合查询
- 2012年MacBook更换SSD固态硬盘和16G内存条
- DNS解析过程中不得不知道的那些事
- 队列及其应用-取牌游戏
- C++ Primer Plus(第六版)第4章 编程练习答案详解
- 混合积的几何意义_20160512