LeetCode 33. Search in Rotated Sorted Arrayhtml
给定一个 “升序” 的 无重复 数组,从中寻找目标值。“升序”:旋转后的升序,例如 [4,5,1,2,3]。数组
时间限制:\(O(lgN)\)。spa
题目要求在 \(O(lgN)\) 时间内找到目标值,很容易想到二分法。若是是普通的升序,普通的二分便可解决问题。题目中提到的旋转后的升序,咱们不知道其“旋转点”在哪,那么有什么特色呢?以题目例子分析:code
对于普通升序数组[0,1,2,3,4,5,6,7],其旋转后可能状况有[1,2,3,4,5,6,7,0]、[2,3,4,5,6,7,0,1][3,4,5,6,7,0,1,2]、[4,5,6,7,0,1,2,3]、[5,6,7,0,1,2,3,4]、[6,7,0,1,2,3,4,5]、[7,0,1,2,3,4,5,6]七种状况。htm
二分法的关键在于取中间值后,与目标值比较,判断左半段仍是右半段。观察上述八种状况,能够发现以中间值为界,左右两部分总有一段是绝对升序的。当 nums[mid] < nums[right] 时,右半段绝对升序;当 nums[mid] > nums[right] 时,左半段绝对升序。blog
仔细想一想,这个规律很简单的,不须要证实。ip
旋转有序的特色已经找到了,咱们只须要判断目标值是否在绝对升序的范围内,就能够肯定二分的边界了。leetcode
class Solution { public: int search(vector<int>& nums, int target) { int len = nums.size(); if (len < 1) return -1; int left = 0, right = len-1; while(left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) return mid; if (nums[mid] < nums[right]) { if (nums[mid] < target && nums[right] >= target) left = mid+1; else right = mid-1; } else { if (nums[left] <= target && nums[mid] > target) right = mid-1; else left = mid+1; } } return -1; } };
LeetCode 81. Search in Rotated Sorted Array IIget
LeetCode All in One题解汇总(持续更新中...)博客
本文版权归做者AlvinZH和博客园全部,欢迎转载和商用,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利.