旋转有序数组的搜索

旋转有序数组的搜索

问题

这个题目说的是,给你一个旋转有序的整数数组,和一个目标值,你要在数组里找到目标值,然后返回它的下标。如果找不到则返回 -1。注意:数组中不存在重复数字。旋转有序数组是由一个原来有序的数组通过左旋或右旋部分数字到另一端形成的。注意,这里我们讨论的有序默认都指递增排序。

比如说,原来的有序数组是:

1, 2, 3, 4, 5, 6, 7, 8

把 1, 2, 3, 4 旋转到数组右边,得到的数组 a 是:

5, 6, 7, 8, 1, 2, 3, 4

假如给你的目标值是 6,则要返回它的下标 1;假如给你的目标值是 0,0 不在这个数组中,因此返回 -1。

代码

public class AlgoCasts {

  // Time: O(log(n)), Space: O(1)
  public int searchInRotatedSortedArray(int[] nums, int target) {
    if (nums == null || nums.length == 0) return -1;
    int low = 0, high = nums.length - 1;
    while (low <= high) {
      int mid = low + (high - low) / 2;
      if (target == nums[mid]) return mid;
      if (nums[mid] >= nums[low]) {
        if (target < nums[mid] && target >= nums[low]) high = mid - 1;
        else low = mid + 1;
      } else {
        if (target > nums[mid] && target <= nums[high]) low = mid + 1;
        else high = mid - 1;
      }
    }
    return -1;
  }

}

  转载请注明: ForwardXu 旋转有序数组的搜索

 上一篇
旋转二维数组 旋转二维数组
求和为给定值的组合问题 这个题目说的是,给你一个 n x n 的二维数组,你要沿顺时针方向将它旋转 90 度。要求你不能使用额外的存储空间,就地在原数组操作。 比如说,给你的二维数组是: 1, 2, 3 4, 5, 6 7, 8, 9
2019-01-06
下一篇 
数组的下一个排列 数组的下一个排列
数组的下一个排列问题 这个题目说的是,给你一个整数数组,每一个元素是一个 0 到 9 的整数,数组的排列形成了一个有效的数字。你要找到数组的下一个排列,使它形成的数字是大于当前排列的第一个数字。如果当前排列表示的已经是最大数字,则返回这个数
2019-01-06
  目录