LeetCode--搜索旋转排序数组

LeetCode链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

题目:

  假设按照升序排序的数组在某个未知的点上进行了旋转,例如,数组[0, 1, 2, 4, 5, 6, 7]可能变为[4, 5, 6, 7, 0, 1, 2]

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

  可以假设数组中不存在重复元素,要求算法的时间复杂度必须是O(log n)级别;

  我的想法是:先找到旋转点,再找目标值target在数组中的索引。这两个查找过程均使用二分查找,时间复杂度为O(log n);

    如果一个有序数组发生了旋转,整体上将不再有序,但是会得到两个部分有序的子数组,如上例中的[4, 5, 6, 7]和[0, 1, 2]这两个部分仍是有序的,所以可以使用二分查找,找到旋转点,旋转点也就是两个有序子数组的分界点;

    找到旋转点后再将target的值与nums[旋转点]的值进行比较,选择在哪个有序子数组里使用二分查找寻找target所对应的索引值

 1 public class Solution {
 2     public int search(int[] nums, int target) {
 3         if(nums == null || nums.length == 0) return -1;
 4         // 先找到旋转点,旋转点也就是两个有序子数组的分界点
 5         int left = 0, right = nums.length-1, mid = right;
 6         int rotatePoint = right;  // 记录旋转点,它始终指向的是数组元素的最大值
 7         while(left <= right) {
 8             if(nums[left] <= nums[right]) {    // 当条件成立时,说明该子数组是有序子数组,即找到了两个有序子数组的分界点
 9                 rotatePoint = right < mid ? right : left-1;
10                 break;
11             }
12             else {
13                 mid = (left + right) / 2;
14                 if(nums[left] > nums[mid]) {
15                     right = mid - 1;  //说明旋转点在mid的左边
16                 }
17                 else {
18                     left = mid + 1;  // 说明旋转点在mid的右边
19                 }
20             }
21         }
22         
23         left = 0;
24         right = nums.length - 1;
25         if(nums[left] > nums[right]) {  // 判断nums是否发生了旋转,如果发生了,那么判断应该在哪个有序子数组里查找
26             if(target >= nums[left]) {
27                 right = rotatePoint;
28             }else {
29                 left = rotatePoint + 1;
30             }
31         }
32         while(left <= right) {       
33             mid = (left + right) / 2;
34             if (target > nums[mid]) {
35                 left = mid + 1;
36             }
37             else if(target < nums[mid]){
38                 right = mid - 1;
39             }
40             else {
41                 return mid;
42             }
43         }
44         return -1;
45     }
46 }

猜你喜欢

转载自www.cnblogs.com/latup/p/11756926.html