乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array
乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array
一、前言
将传统的问题进行一些稍微的变形,这个时候我们可能无所适从了,因此还是实践出真知,多练习多总结多思考。
二、Search in Rotated Sorted Array
2.1 问题
2.2 分析与解决
题目限制了时间复杂度为O(log(n)),刚遇到这个题目的时候我们可能会感到眩晕,因为如果是正常的二分查找算法我们当然可以很快的写出代码,但是这里因为是两节从小到大排序的数字,并且互不相交,我们就不知道要怎么办了,其实仔细想一下还是使用二分查找算法,找到中间点,只需要拿中间的元素和两边的比较就能知道这个中间的元素是属于那一节的了,之后我们就可以看看我们要找的元素是不是在这个节之内,然后调整指针,经过一次调整之后,以后的查找就和之前的二分查找一个样子了。这是非常有趣的。那假如说我们的两节变成三节呢?这样的判断就比较麻烦了,当我们和最后的比,如果大于最后的,那确定不是最后一节的,但是小于的话,我们就不能判断了。
public class Solution { public int search(int[] nums, int target) { int start = 0; int end = nums.length - 1; while (start <= end){ int mid = (start + end) / 2; if (nums[mid] == target) return mid; if (nums[start] <= nums[mid]){ if (target < nums[mid] && target >= nums[start]) end = mid - 1; else start = mid + 1; } if (nums[mid] <= nums[end]){ if (target > nums[mid] && target <= nums[end]) start = mid + 1; else end = mid - 1; } } return -1; } }
三、总结
遇到这样的问题的时候,最好是拿出一张纸画一个图,然后按照原始的方法不断地扩展下去,这样可以更快的找到答案。