Study Notes
  • Kuma Blog
  • AI
    • AI-Resources
    • AI-books
    • AI_Blogs
      • Exploring the Future of AI in 2025: Key Trends and Predictions
      • Exploring the Power of Kuma AI Tools in 2025
      • The Future of AI in 2025: Predicting the Next Big Trends
      • The Future of AI in 2025: Predictions and Insights
      • The Future of AI in 2025: Trends and Predictions
      • The-Future-of-AI-in-2025-Trends-to-Watch_2025-05-30
      • Untitled-1748347240822_2025-05-27
      • Untitled-1748520038559_2025-05-29
    • Kuma_AI_Daily_NewsLetter
      • Kuma AI Daily News Letter 2025-05-25
      • Kuma AI Daily News Letter 2025-05-26
      • Kuma AI Daily News Letter 2025-05-27
      • Kuma AI Daily News Letter 2025-05-28
      • Kuma AI Daily News Letter 2025-05-29
      • Kuma AI Daily News Letter 2025-05-30
      • Kuma AI Daily News Letter 2025-05-31
    • Prompts
      • Prompts Free Courses
    • AI_Agents
      • Kuma AI Travel Agent
        • Kuma AI Travel Agent
  • Movies
    • 2024
    • 2024
    • 2024
  • Google
    • chunked-palindrome
  • Setup
    • How to add a new user into Ubuntu and setup ssh key?
    • How to set up VSCode remote server connect with browser with Docker
  • kubernetes
  • Books
    • Designing-Data-Intensive-Applications
      • 第一章 — 可靠性,可扩展性,可维护性的应用程序(Reliable, Scalable, and Maintainable Applications)
    • System-Performance
      • Design-Data-Intensive-Application
      • Chapter 2: Methodologies
  • Languages
    • japanese
      • japanese-week
  • Leetcode
    • 30DayChallenge
      • LRU-cache
      • backspace-string-compare
      • binary-tree-maximum-path-sum
      • bitwise-and-number-range
      • check-string-valid-sequence-from-root-to-leaves-path-in-bst
      • construct-binary-search-tree-from-preorder-traversal
      • contiguous-array
      • counting-elements
      • diameter-of-binary-tree
      • first-unique-number
      • group-anagrams
      • jump-game
      • last-stone-weight
      • leftmost-column-with-at-least-a-one
      • longest-common-subsequect
      • maximal-square
      • maximum-subarray
      • middle-of-the-linked-list
      • min-stack
      • minimun-path-sum
      • move-zeroes
      • perform-string-shifts
      • product-of-array-except-itself
      • search-in-rotated-sorted-array
      • subarray-sum-equals-k
      • valid-parenthesis-string
    • English Solution
      • 1168.optimize-water-distribution-in-a-village-en
      • 1171.remove-zero-sum-consecutive-nodes-from-linked-list-en
      • 1177.can-make-palindrome-from-substring-en
      • 1343.number-of-avg-subarr-sizek-greater-or-equal-threshold
      • 1345.jump-game-iv
      • 25.reverse-nodes-in-k-groups-en
      • 474.ones-and-zeros-en
      • 53.maximum-sum-subarray-en
      • 547.friend-circles-en
      • 79.word-search-en
    • May2020Challenge
      • check-if-straight-line
      • cousins-in-binary-tree
      • find-town-judge
      • first-bad-version
      • first-unique-character-in-a-string
      • flood-fill
      • implement-trie
      • jewels-and-stones
      • majority-element
      • maximum-sum-circular-subarray
      • number-complement
      • odd-even-linkedlist
      • ransom-note
      • remove-k-digits
      • single-element-in-sorted-array
      • valid-perfect-square
    • python
      • 000017-Letter-Combinations-of-a-Phone-Number
      • 000032-Longest-Valid-Parentheses
      • 000033-Search-in-Rotated-Sorted-Array
      • 000046-Permutations
      • 000074-Search-a-2D-Matrix
      • 000077-Combinations
      • 000081-Search-in-Rotated-Sorted-Array-II
      • 000137-single-number-ii
      • 000139-Word-Break
      • 000207-courses-schedule
      • 000209-Minimum-Size-Subarray-Sum
      • 000376-wiggle-subsequence
      • 000445-Add-Two-Numbers-II
      • 000486-Predict-the-Winner
      • 000518-Coin-Change-II
      • 000673-Number-of-Longest-Increasing-Subsequence
      • 000688-Knight-Probability-in-Chessboard
      • 000735-Asteroid-Collision
      • 000852-Peak-Index-in-a-Mountain-Array
      • 859-Buddy-Strings
      • 000864-Shortest-Path-to-Get-All-Keys
      • 000920-Number-of-Music-Playlists
      • 001218-Longest-Arithmetic-Subsequence-of-Given-Difference
      • 001235-Maximum-Profit-in-Job-Scheduling
      • 001493-Longest-Subarray-of 1-After-Deleting-One-Element
      • Problem
      • 002024-Maximize-the-Confusion-of-an-Exam
      • 2305-Fair-Distribution-of-Cookies
      • 002616-Minimize-the-Maximum-Difference-of-Pairs
      • 00802-Find-Eventual-Safe-States
    • 中文版解题
      • 1147.longest-chunked-palindrome-decomposition-cn
      • 1168.optimize-water-distribution-in-a-village-cn
      • 1171.remove-zero-sum-consecutive-nodes-from-linked-list-cn
      • 1177.can-make-palindrome-from-substring-cn
      • 215.kth-largest-element-in-an-array-cn
      • 25.reverse-nodes-in-k-groups-cn
      • 30.substring-with-concatenation-of-all-words-cn
      • 4.median-of-two-sorted-array-cn
      • 460.LFU-cache-cn
      • 474.ones-and-zeros-cn
      • 53.maximum-sum-subarray-cn
      • 79.word-search-cn
  • Readings
    • 2020
      • Design-Data-Intensive-Application
      • 亲爱的提奥
      • 理想国
      • 贫穷的本质
Powered by GitBook
On this page
  • Problem
  • Problem Description
  • Solution
  • Complexity Analysis
  • Code - Binary search

Was this helpful?

  1. Leetcode
  2. 30DayChallenge

search-in-rotated-sorted-array

Previousproduct-of-array-except-itselfNextsubarray-sum-equals-k

Last updated 5 years ago

Was this helpful?

Problem

Problem Description

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Your algorithm's runtime complexity must be in the order of O(log n).

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

Solution

This problem asked to implement in O(logn). Binary search should come into your mind when you see O(logn), sorted and search keywords.

  1. Intuitive solution is simple, iterate through array, find target in nums return pos, not, return -1, O(n)

  2. Binary search, given array is rotated sorted array, meaning there are 2 sorted array. when do binary search, need to carefully compare

    target and nums[mid] and nums[lo] to chose whether go right (higher) or left (lower).

    • define lo, hi, and mid = (lo + hi)/2.

    • if target == nums[mid] found, return mid and exit.

    • if nums[mid] >= nums[lo] meaning mid is within sorted parts, now compare target,

      • if target >= nums[lo] && target <= nums[md], target is located in [lo, mid] sorted part, search left, hi = mid - 1

      • else target located in [mid, hi], search right, lo = mid + 1

    • else check compare target with hi and mid value

      • if target >= nums[mid] && target <= nums[hi], target is located in [mid, hi] part, search right, lo = mid + 1

        else target located in [lo, mid] part, search left, hi = mid - 1

For example:

Complexity Analysis

Time Complexity: O(log(N))

Space Complexity: O(1)

  • N - the length of array nums

Code - Binary search

class Solution {
    public int search(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int lo = 0;
        int hi = nums.length - 1;
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            // found, return mid, exit
            if (nums[mid] == target) {
                return mid;
            }
            // mid is within sorted parts
            if (nums[lo] <= nums[mid]) {
                // target located at [lo, mid] part, search left
                if (target >= nums[lo] && target <= nums[mid]) {
                    hi = mid - 1;
                } else {
                    lo = mid + 1;
                }
            } else {
                // target located at [mid, hi] part, search right
                if (target >= nums[mid] && target <= nums[hi]) {
                    lo = mid + 1;
                } else {
                    hi = mid - 1;
                }
            }
        }
        return nums[lo] == target ? lo : -1;
    }
}

Naive solution - O(n)

class Solution {
    public int search(int[] nums, int target) {
        if (nums == null || nums.length == 0) return -1;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) return i;
        }
        return -1;
    }
}
Search in Rotated Sorted Array
Search in Rotated Sorted Array