搜索旋转排序数组

55 阅读1分钟

leedcode

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
     //二分查找
        const binarySearch = (nums, low, high, target) => {
          while (low <= high) {
            const mid = Math.floor((low + high) / 2);
            if (nums[mid] > target) {
              high = mid - 1;
            } else if (nums[mid] === target) {
              return mid;
            } else {
              low = mid + 1;
            }
          }

          return -1;
        };
        //查找当前下标大于下一个下标的数字
        const getSearchIndex = (arr) => {
          let low = 0;
          let high = arr.length - 1;
          while (low <= high) {
            const mid = Math.floor((low + high) / 2);
            if (arr[mid] > arr[arr.length - 1]) {
              if (arr[mid] > arr[mid + 1]) {
                return mid;
              } else {
                low = mid + 1;
              }
            } else {
              high = mid - 1;
            }
          }

          return -1;
        };

        const searchIndex = getSearchIndex(nums);
        if (searchIndex == -1) {
          return binarySearch(nums, 0, nums.length - 1, target);
        } else {
          if (target > nums[nums.length - 1]) {
            return binarySearch(nums, 0, searchIndex, target);
          } else {
            return binarySearch(nums, searchIndex + 1, nums.length - 1, target);
          }
        }
};