就只想到了O(n)的,
想到的二分,

  1. target<nums[left] 则在右边有序搜索
  2. target>=nums[left],在左边有序搜素
  3. 自然是错误的,于是搁置不得了之。

看了题解恍然大悟。
以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.搜索旋转排序数组相关推荐

  1. LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置

    前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...

  2. LeetCode—33. 搜索旋转排序数组

    33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...

  3. 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, ...

  4. 数组的合并和升序排列_leetcode 33 搜索旋转排序数组

    给你一个升序排列的整数数组 nums ,和一个整数 target . 假设按照升序排序的数组在预先未知的某个点上进行了旋转.(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0 ...

  5. LeetCode高频题33. 搜索旋转排序数组

    LeetCode高频题33. 搜索旋转排序数组 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批A ...

  6. 【Leetcode】33. 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

  7. leetcode 33 搜索旋转排序数组 到处是细节的好题

    这个题想了想就会做,只是细节真的能卡死人,找了好久的bug.甚至我怀疑我现在的代码可能还有错,只是没例子测出来. 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...

  8. LeetCode 33. 搜索旋转排序数组(二分查找)

    1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...

  9. leetcode —— 33. 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

最新文章

  1. TS流解析之PAT表格解析
  2. Go Embed简明教程
  3. 三十五、数据仓库的设计和应用
  4. yolo人脸检测数据集_自定义数据集上的Yolo-V5对象检测
  5. 华为鸿蒙净水机,华为鸿蒙OS 2.0手机版功能抢先曝光
  6. jsonhelper java_JSON和JAVA的POJO的相互转换
  7. SecureCRT更改字体
  8. js高级学习笔记(b站尚硅谷)-10-instanceof
  9. Ubuntu下安装stlink-v2驱动
  10. 钉钉微应用调用支付宝JSAPI进行支付
  11. mp-mtgsig 美团iOS 签名逆向工程分析
  12. 费希纳定律的推导过程图解
  13. Gym 100818F Irrational Roots
  14. calc() 工作原理
  15. SQL查询语句、联合查询
  16. 2012年MacBook更换SSD固态硬盘和16G内存条
  17. DNS解析过程中不得不知道的那些事
  18. 队列及其应用-取牌游戏
  19. C++ Primer Plus(第六版)第4章 编程练习答案详解
  20. 混合积的几何意义_20160512

热门文章

  1. 【云计算】云上建站快速入门:博客、论坛、CMS、电子商务网站统统
  2. TypeScript 3.4.5 发布,修复节点运行问题
  3. Spark集群搭建【Spark+Hadoop+Scala+Zookeeper】
  4. 从find_vma和find_vma_prev看内核
  5. Android自定义滑动验证条
  6. 多线程join(加入)
  7. fullpage的应用
  8. c++ 返回对象的引用要小心
  9. Flume的安装与配置
  10. SQLServer 中Case When的用法