博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 33.搜索旋转排序数组
阅读量:5296 次
发布时间:2019-06-14

本文共 1269 字,大约阅读时间需要 4 分钟。

搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例 1:

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

输出: 4

 

这道题让在旋转数组中搜索一个给定值,若存在返回坐标,若不存在返回-1。我们还是考虑二分搜索法,但是这道题的难点在于我们不知道原数组在哪旋转了,我们还是用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法:

0  1  2   4  5  6  7

7  0  1   2  4  5  6

6  7  0   1  2  4  5

5  6  7   0  1  2  4

4  5  6  7  0  1  2

2  4  5  6  7  0  1

1  2  4  5  6  7  0

二分搜索法的关键在于获得了中间数后,判断下面要搜索左半段还是右半段,我们观察上面红色加粗的数字都是升序的,由此我们可以观察出规律,如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了,代码如下

 
1 class Solution { 2     public int search(int[] nums, int target) { 3         int n=nums.length; 4         if(n==0) return -1; 5         int left=0,right=n-1; 6         while(left<=right){ 7             int mid=(left+right)/2; 8             if(nums[mid]==target) return mid; 9             else if(nums[mid]
=target) left=mid+1;11 else right=mid-1;12 }else{13 if(nums[left]<=target && nums[mid]>target) right=mid-1;14 else left=mid+1;15 }16 }17 return -1;18 }19 }
 

 

 

转载于:https://www.cnblogs.com/kexinxin/p/10163004.html

你可能感兴趣的文章
Leetcode 268 Missing Number
查看>>
00-自测1. 打印沙漏
查看>>
UNITY在VS中调试
查看>>
福建省第八届 Triangles
查看>>
P1182 数列分段`Section II` P1316 丢瓶盖 二分答案
查看>>
更新下载库update绝对详解
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
Scala入门(1)Linux下Scala(2.12.1)安装
查看>>
laravel
查看>>
installing the matplotlib via pip in the enviroment dos
查看>>
bzoj3312: [Usaco2013 Nov]No Change
查看>>
如何改善下面的代码 领导说了很耗资源
查看>>
Quartus II 中常见Warning 原因及解决方法
查看>>
高德地图 – 1.问题集锦
查看>>
php中的isset和empty的用法区别
查看>>
ajax VS websocket
查看>>
Android ViewPager 动画效果
查看>>
Android ijkplayer详解使用教程
查看>>
Android UI-仿微信底部导航栏布局
查看>>
Android中pendingIntent的深入理解
查看>>