整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

示例 1:

输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:

输入:nums = [1], target = 0
输出:-1

提示:

1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
-10^4 <= target <= 10^4

进阶:你可以设计一个时间复杂度为 O(log n) 的解决方案吗?

首先先确定数组中的最大值,通过最大值把数组确定为2部分,再两部分进行二分。
那么怎么找到最大值呢,可以参考我写的这篇博客(寻找旋转排序数组中的最小值)

找到最值就很简单了

class Solution {public int search(int[] nums, int target) {int len = nums.length -1 ;int left = 0 ,right = len;int Kindex = findK(left ,right ,nums);int leftindex = findleft(left,Kindex -1,nums,target);if(leftindex != -1){return leftindex;}int rithindex = findleft(Kindex  ,right,nums,target);if(rithindex != -1){return rithindex;}return  -1;}public int findleft(int left ,int right,int[] nums,int target){while(left <= right){int mid = left + ((right - left)>>1);// System.out.println(nums[mid]);if(nums[mid] == target){return  mid;}else if(nums[mid]>target){right = mid - 1;}else{left = mid + 1;}}return  -1;}public int findK(int left ,int right ,int[] nums){while(left < right){int mid = left + (( right - left) >> 1);if(nums[mid] <nums[right]){right = mid;}else {left = mid + 1;}}return left;}
}

搜索旋转排序数组(JAVA 二分查找)相关推荐

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

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

  2. leetcode 81. 搜索旋转排序数组 II(二分查找)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...

  3. LeetCode81. 搜索旋转排序数组 II(二分查找)

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...

  4. 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...

  5. 《LeetCode力扣练习》第33题 搜索旋转排序数组 Java

    <LeetCode力扣练习>第33题 搜索旋转排序数组 Java 一.资源 题目: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下 ...

  6. 【LeetCode - 33】搜索旋转排序数组(二分)

    力扣 解题报告: 二分.但是有不少细节要考虑清楚. 所以干脆考虑另一种二分的方式.也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量+取模完成.这样就不需 ...

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

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

  8. [Leedcode][JAVA][第33题][搜索旋转排序数组]

    [问题描述][33. 搜索旋转排序数组] [中等] 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). ...

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

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

最新文章

  1. Python基础教程(第3版)之一些内置的异常类
  2. 理解至上:数位dp(ybtoj-B数计数)
  3. [luoguP2801] 教主的魔法(二分 + 分块)
  4. 利用JMeter进行Web测试(简介适合初学者)
  5. java三角形创建子类,A派生出子类B,B派生出子类C,并且在Java源代码中有如下声明: 1.A a0=new 2.A a1 =new 3.A a2=new 问以下哪个说法是正确的?()...
  6. ES10新特性_字符串扩展方法_trimStart--trimEnd---JavaScript_ECMAScript_ES6-ES11新特性工作笔记058
  7. 让你难忘的一段情感故事是什么?
  8. 软件定制开发,程序外包就在这
  9. 不同应用系统之间数据交互的几种方式
  10. 【大云制造】大云运营管理平台V1.4发布——不忘初心,砥砺前行,为了创造无限的价值!...
  11. SylixOS中RTC设备驱动
  12. 计算机网络及电子邮件的原理,全国2006年4月全国自考计算机网络基本原理真题及答案..doc...
  13. 西威变频器使用说明书_西威变频器说明书
  14. 首届InterSystems Idea创意马拉松
  15. php日程提醒,PHPOA日程安排系统,建立井然有序的工作计划
  16. Java并发57:Akka Actors并发框架浅谈及入门示例
  17. OAuth2 oauth_client_details表字段的详细说明
  18. php文件目录教程,详谈PHP文件目录基础操作_PHP教程
  19. 使用photoshop对图片像素级的标注
  20. LaTex常用公式和字母

热门文章

  1. 细数 SharedPreferences 的那些槽点 !
  2. 拆解小米4C: 依照小米4i刻出来的安卓小王子---ESM
  3. python 组织结构树_如何使用Python绘制组织树图?
  4. 上海python培训中心
  5. 素食的益处与烟酒肉乳的代价
  6. 解决端口被占用的方法
  7. Web漏洞扫描器—Burp Suite
  8. 免费计算机EBOOK下载(英文版)
  9. Jetpack Compose - Button
  10. Android开发时包名、签名、渠道和版本号的易坑点(转)