Bird
Raised Fist0
Interview Prepmodified-binary-searchmediumAmazonFacebookGoogleMicrosoftBloomberg

Search in Rotated Sorted Array

Choose your preparation mode4 modes available
</>
IDE
def search(nums: list[int], target: int) -> int:public int search(int[] nums, int target)int search(vector<int> nums, int target)function search(nums, target)
def search(nums, target):
    # Write your solution here
    pass
class Solution {
    public int search(int[] nums, int target) {
        // Write your solution here
        return -1;
    }
}
#include <vector>
using namespace std;

int search(vector<int> nums, int target) {
    // Write your solution here
    return -1;
}
function search(nums, target) {
    // Write your solution here
    return -1;
}
Coming soon
0/10
Common Bugs to Avoid
Wrong: -1 for target presentFailed to correctly identify which half of the array is sorted and update search boundaries.✅ Add condition to check if nums[left] <= nums[mid] to identify sorted half and narrow search accordingly.
Wrong: Index of wrong elementIncorrect boundary updates causing search in wrong half or off-by-one errors.✅ Ensure left and right pointers are updated correctly based on target's relation to sorted half.
Wrong: Infinite loop or timeoutNot updating search boundaries properly or using linear search on large input.✅ Implement modified binary search with proper boundary updates and termination conditions.
Wrong: Wrong index for single-element arrayNot handling single-element arrays as a base case.✅ Add explicit check for array length 1 and compare target with nums[0].
✓
Test Cases
t1_01basic
Input{"nums":[4,5,6,7,0,1,2],"target":0}
Expected4

The target 0 is at index 4 in the rotated array.

t1_02basic
Input{"nums":[6,7,8,1,2,3,4,5],"target":3}
Expected5

Target 3 is at index 5 in the rotated array.

t2_01edge
Input{"nums":[1],"target":1}
Expected0

Single element array where target is present at index 0.

t2_02edge
Input{"nums":[1],"target":2}
Expected-1

Single element array where target is absent; should return -1.

t2_03edge
Input{"nums":[1,2,3,4,5,6,7],"target":5}
Expected4

Array not rotated (pivot at 0); normal binary search should find target at index 4.

t2_04edge
Input{"nums":[2,3,4,5,6,7,1],"target":1}
Expected6

Target at the end of rotated array; tests boundary condition.

t3_01corner
Input{"nums":[4,5,6,7,0,1,2],"target":7}
Expected3

Target is the pivot element at index 3.

t3_02corner
Input{"nums":[5,6,7,8,9,1,2,3,4],"target":1}
Expected5

Greedy trap test: target in smaller rotated half, not the sorted half at mid.

t3_03corner
Input{"nums":[6,7,8,9,1,2,3,4,5],"target":10}
Expected-1

Target not present and greater than all elements; tests correct termination.

t4_01performance
Input{"nums":[50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999],"target":12345}
Expected62345

Large rotated array with n=100000; O(log n) solution must complete within 2 seconds.

Practice

(1/5)
1. Given the following recursive binary search code, what is the return value when searching for target = 3 in nums = [1, 3, 5] starting with low=0 and high=2?
def binary_search_recursive(nums, target, low, high):
    if low > high:
        return -1
    mid = low + (high - low) // 2
    if nums[mid] == target:
        return mid
    elif nums[mid] < target:
        return binary_search_recursive(nums, target, mid + 1, high)
    else:
        return binary_search_recursive(nums, target, low, mid - 1)

print(binary_search_recursive([1,3,5], 3, 0, 2))
easy
A. -1
B. 1
C. 0
D. 2

Solution

  1. Step 1: Calculate mid for low=0, high=2

    mid = 0 + (2-0)//2 = 1; nums[1] = 3 equals target -> return 1.
  2. Final Answer:

    Option B -> Option B
  3. Quick Check:

    Target found at index 1 on first recursion [OK]
Hint: Mid calculation picks index 1 with target 3 [OK]
Common Mistakes:
  • Returning -1 if confused about base case
  • Off-by-one errors in mid calculation
  • Returning wrong index due to boundary errors
2. You are given a sorted array and a target number x. The task is to find k elements closest to x in the array, with ties broken by choosing the smaller elements first. Which of the following approaches guarantees an optimal solution with logarithmic search complexity on the array?
easy
A. Use a greedy approach by iteratively picking the closest element to x until k elements are chosen.
B. Use dynamic programming to compute the minimum distance sum for all windows of size k and pick the minimum.
C. Perform a binary search to find the left boundary of the window of size k that contains the closest elements to x.
D. Use a two-pointer sliding window starting from both ends of the array and shrink towards the center until k elements remain.

Solution

  1. Step 1: Understand problem constraints

    The array is sorted, and we want k closest elements to x with tie-breakers favoring smaller elements.
  2. Step 2: Identify approach with logarithmic complexity

    Binary search on the left boundary of the window of size k efficiently narrows down the candidate window in O(log(n-k)) time, guaranteeing optimality.
  3. Final Answer:

    Option C -> Option C
  4. Quick Check:

    Binary search exploits sorted order and window size constraints [OK]
Hint: Binary search on window boundaries exploits sorted array [OK]
Common Mistakes:
  • Assuming greedy selection always yields optimal window
  • Using DP unnecessarily increasing complexity
  • Two-pointer approach is linear, not logarithmic
3. Given the following code for fast exponentiation, what is the value of result after the first iteration of the while loop when calling myPow(2.0, 3)?
easy
A. 1.0
B. 8.0
C. 4.0
D. 2.0

Solution

  1. Step 1: Trace first iteration with n=3

    Initial values: result=1.0, current_product=2.0, n=3. Since n%2==1, result *= current_product -> result=2.0.
  2. Step 2: Update current_product and n

    current_product *= current_product -> 4.0, n //= 2 -> 1. Loop continues.
  3. Final Answer:

    Option D -> Option D
  4. Quick Check:

    After first iteration, result updated once by current_product=2.0 [OK]
Hint: Check if n is odd to multiply result first [OK]
Common Mistakes:
  • Forgetting to multiply result when n is odd
  • Updating current_product before result
  • Off-by-one in loop iterations
4. You need to find the largest integer r such that r * r ≤ x for a given non-negative integer x. Which algorithmic approach guarantees an efficient and correct solution for this problem?
easy
A. Sorting all numbers and selecting the closest square root
B. Greedy approach incrementing from 0 until r * r > x
C. Dynamic programming to build up solutions for all numbers up to x
D. Modified binary search narrowing down the range of possible roots

Solution

  1. Step 1: Understand the problem constraints

    The problem requires finding the integer square root efficiently without checking all numbers linearly.
  2. Step 2: Identify the suitable algorithm

    Modified binary search efficiently narrows down the search space by comparing mid*mid with x, guaranteeing logarithmic time complexity.
  3. Final Answer:

    Option D -> Option D
  4. Quick Check:

    Binary search halves the search space each iteration [OK]
Hint: Binary search efficiently narrows down integer roots [OK]
Common Mistakes:
  • Assuming greedy linear search is efficient
  • Confusing DP with this problem
  • Using sorting which is irrelevant
5. Consider the following buggy feasibility check code for Capacity to Ship Packages. Which line contains the subtle bug that can cause incorrect feasibility results?
def can_ship_early_stop(weights, days, capacity):
    day_count = 1
    current_load = 0
    for w in weights:
        if current_load + w > capacity:
            day_count += 1
            current_load = 0
            if day_count > days:
                return False
        current_load += w
    return True
medium
A. Line checking if day_count exceeds days
B. Line incrementing day_count after resetting current_load
C. Line resetting current_load to 0 before incrementing day_count
D. Line adding current package weight to current_load

Solution

  1. Step 1: Identify order of operations in feasibility check

    The bug is resetting current_load to 0 before incrementing day_count, which causes the current package weight to be lost.
  2. Step 2: Correct approach

    Day count should increment first, then current_load reset to 0, then add current package weight to current_load.
  3. Final Answer:

    Option C -> Option C
  4. Quick Check:

    Resetting current_load before day_count causes lost package weight [OK]
Hint: Reset current_load after incrementing day_count and before adding weight [OK]
Common Mistakes:
  • Swapping order of reset and increment
  • Forgetting to increment day_count
  • Adding weight before reset
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard