Medium
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] <= 104nums are unique.nums is an ascending array that is possibly rotated.-104 <= target <= 104To solve the “Search in Rotated Sorted Array” problem in Swift with a Solution class, we can follow these steps:
Solution class.search that takes an integer array nums and an integer target as input and returns an integer representing the index of target in nums. If target is not found, return -1.target in the rotated sorted array.left to 0 and the right pointer right to the length of nums minus 1.left is less than or equal to right:
mid as (left + right) / 2.nums[mid] is equal to target, return mid.nums[left] to nums[mid]) is sorted:
nums[left] <= nums[mid] and nums[left] <= target < nums[mid], update right = mid - 1.left = mid + 1.nums[mid] to nums[right]) is sorted:
nums[mid] <= nums[right] and nums[mid] < target <= nums[right], update left = mid + 1.right = mid - 1.target is not found, return -1.Here’s the implementation:
public class Solution {
public func search(_ nums: [Int], _ target: Int) -> Int {
var lo = 0
var hi = nums.count - 1
while lo <= hi {
let mid = lo + (hi - lo) / 2
if nums[mid] == target {
return mid
}
// Check if the left half is sorted
if nums[lo] <= nums[mid] {
// Check if the target is in the left half
if nums[lo] <= target && target <= nums[mid] {
hi = mid - 1
} else {
lo = mid + 1
}
} else {
// Check if the target is in the right half
if nums[mid] <= target && target <= nums[hi] {
lo = mid + 1
} else {
hi = mid - 1
}
}
}
return -1
}
}
This implementation provides a solution to the “Search in Rotated Sorted Array” problem in Swift. It searches for the index of target in the rotated sorted array nums. The algorithm has a time complexity of O(log n).