Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    [LeetCode 33] Search in Rotated Sorted Array

    Published Dec 14, 2021 [  BinarySearch  ]

    Problem

    There is an integer array nums sorted in ascending order (with distinct values).

    Prior to being passed to your function, nums is possibly rotated at an unknown pivot index k (1 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,5,6,7] might be rotated at pivot index 3 and become [4,5,6,7,0,1,2].

    Given the array nums after the possible rotation and an integer target, return the index of target if it is in nums, or -1 if it is not in nums.

    You must write an algorithm with O(log n) runtime complexity.

    Example 1:

    Input: nums = [4,5,6,7,0,1,2], target = 0
    Output: 4
    

    Example 2:

    Input: nums = [4,5,6,7,0,1,2], target = 3
    Output: -1
    

    Example 3:

    Input: nums = [1], target = 0
    Output: -1
    

    Constraints:

    - 1 <= nums.length <= 5000
    - -104 <= nums[i] <= 104
    - All values of nums are unique.
    - nums is an ascending array that is possibly rotated.
    - -104 <= target <= 104
    

    Thoughts

    • We can use binary search for this
    • We need check which portion of the array is sorted

    Typescript

    function search(nums: number[], target: number): number {
        let left = 0, right = nums.length - 1
        
        // equal sign to handle [1] single element case
        while(left <= right) {
            let mid = Math.floor((left + right) / 2)
            
            // return the index if we find it
            if(nums[mid] === target) {
                return mid;
            }
            
            // left sorted part
            if(nums[left] <= nums[mid]) {
    	    // search left 
                if(target < nums[mid] && target >= nums[left]) {
                    right = mid - 1;
                } else {	// search right
                    left = mid + 1;
                }
            } else {  // right sorted part
    	    // search right
                if(target > nums[mid] && target <= nums[right]) {
                    left = mid + 1;
                } else {	// search left
                    right = mid - 1;
                }
            }
        }
        
        return -1;
    };
    

    Reference