x

Search in Rotated Sorted Array

Leetcode #33 | Medium | Бин. поиск

Идея

Последний элемент - максимальный элемент второй половины. Бин. поиском находим точку перелома. Затем если наш таргет в первой половине запускаем бин поиск по ней, если во второй - то по второй, половина определяется нашим pivot

Big-O

  • Время O(log(N))
  • Память O(1)

Код

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length, l = -1, r = n;
        while (r - l > 1) {
            int m = (l + r) / 2;
            if (nums[m] <= nums[n - 1]) r = m; else l = m;
        }
        int pivot = r;
        if (target == nums[pivot]) return pivot;
        else if (target > nums[n - 1]) { l = -1; r = pivot; }
        else { l = pivot - 1; r = n; }

        while (r - l > 1) {
            int m = (l + r) / 2;
            if (nums[m] >= target) r = m; else l = m;
        }
        return (r < n && nums[r] == target) ? r : -1;
    }
}
Left-click: follow link, Right-click: select node, Scroll: zoom
x