Table of Contents
Find Minimum in Rotated Sorted Array II With Duplicates
Problem Statement
Suppose an array of length n
sorted in ascending order is rotated between 1
and n
times. For example, the array nums = [0,1,4,4,5,6,7]
might become:
[4,5,6,7,0,1,4]
if it was rotated4
times.[0,1,4,4,5,6,7]
if it was rotated7
times.
Notice that rotating an array [a[0], a[1], a[2], ..., a[n-1]]
1 time results in the array [a[n-1], a[0], a[1], a[2], ..., a[n-2]]
.
Given the sorted rotated array nums
that may contain duplicates, return the minimum element of this array.
You must decrease the overall operation steps as much as possible.
Example 1:
Input: nums = [1,3,5] Output: 1
Example 2:
Input: nums = [2,2,2,0,1] Output: 0
Constraints:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums
is sorted and rotated between1
andn
times.
Follow up: This problem is similar to Find Minimum in Rotated Sorted Array, but nums
may contain duplicates. Would this affect the runtime complexity? How and why?
Logic
- Find min in rotated array logic is same for this solution
- Plus we added extra logic to shrink the array.
- if we find left , mid and right value are equal,
- Just shrink the array by 1
- left++ & right — ; continue
- Please read normal Binary search code for finding target and its comparison with rotated array.
- This will help to build foundation.
Golang Solution
func findMin(nums []int) int {
n := len(nums)
left, right := 0, n-1
// Check which part of the array to search
for left < right {
middle := left + (right-left)/2
// Handle duplicates by shrinking the bounds
if nums[left] == nums[middle] && nums[middle] == nums[right] {
left++
right--
continue
}
// Minimum must be in the right half
if nums[middle] > nums[right] {
left = middle + 1
} else {
// Minimum is in the left half or at middle
right = middle
}
}
// The left pointer will point to the minimum
return nums[left]
}
Output
Input
nums = [2,2,2,0,1]
Output
0
Please visit https: https://codeandalgo.com for more such contents.
Leave a Reply