搜索旋转排序数组(JAVA 二分查找)
整数数组 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 二分查找)相关推荐
- LeetCode 33. 搜索旋转排序数组(二分查找)
1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- leetcode 81. 搜索旋转排序数组 II(二分查找)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...
- LeetCode81. 搜索旋转排序数组 II(二分查找)
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...
- 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...
- 《LeetCode力扣练习》第33题 搜索旋转排序数组 Java
<LeetCode力扣练习>第33题 搜索旋转排序数组 Java 一.资源 题目: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下 ...
- 【LeetCode - 33】搜索旋转排序数组(二分)
力扣 解题报告: 二分.但是有不少细节要考虑清楚. 所以干脆考虑另一种二分的方式.也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量+取模完成.这样就不需 ...
- LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置
前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...
- [Leedcode][JAVA][第33题][搜索旋转排序数组]
[问题描述][33. 搜索旋转排序数组] [中等] 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). ...
- LeetCode—33. 搜索旋转排序数组
33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...
最新文章
- Python基础教程(第3版)之一些内置的异常类
- 理解至上:数位dp(ybtoj-B数计数)
- [luoguP2801] 教主的魔法(二分 + 分块)
- 利用JMeter进行Web测试(简介适合初学者)
- java三角形创建子类,A派生出子类B,B派生出子类C,并且在Java源代码中有如下声明: 1.A a0=new 2.A a1 =new 3.A a2=new 问以下哪个说法是正确的?()...
- ES10新特性_字符串扩展方法_trimStart--trimEnd---JavaScript_ECMAScript_ES6-ES11新特性工作笔记058
- 让你难忘的一段情感故事是什么?
- 软件定制开发,程序外包就在这
- 不同应用系统之间数据交互的几种方式
- 【大云制造】大云运营管理平台V1.4发布——不忘初心,砥砺前行,为了创造无限的价值!...
- SylixOS中RTC设备驱动
- 计算机网络及电子邮件的原理,全国2006年4月全国自考计算机网络基本原理真题及答案..doc...
- 西威变频器使用说明书_西威变频器说明书
- 首届InterSystems Idea创意马拉松
- php日程提醒,PHPOA日程安排系统,建立井然有序的工作计划
- Java并发57:Akka Actors并发框架浅谈及入门示例
- OAuth2 oauth_client_details表字段的详细说明
- php文件目录教程,详谈PHP文件目录基础操作_PHP教程
- 使用photoshop对图片像素级的标注
- LaTex常用公式和字母