当前位置: 面试刷题>> 搜索旋转排序数组(经典算法150题)


### 题目描述 给定一个升序排列的数组在某个点上进行了旋转(例如,数组 `[0,1,2,4,5,6,7]` 可能变为 `[4,5,6,7,0,1,2]`),请编写一个函数来搜索旋转排序数组中的特定目标值。如果数组中存在这个目标值,则返回它的索引;否则返回 `-1`。你可以假设数组中不存在重复的元素。 **示例 1**: ``` 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 ``` **示例 2**: ``` 输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1 ``` ### PHP 示例代码 ```php function search($nums, $target) { $left = 0; $right = count($nums) - 1; while ($left <= $right) { $mid = $left + floor(($right - $left) / 2); if ($nums[$mid] == $target) { return $mid; } if ($nums[$left] <= $nums[$mid]) { // 左半部分是有序的 if ($nums[$left] <= $target && $target < $nums[$mid]) { $right = $mid - 1; } else { $left = $mid + 1; } } else { // 右半部分是有序的 if ($nums[$mid] < $target && $target <= $nums[$right]) { $left = $mid + 1; } else { $right = $mid - 1; } } } return -1; } ``` ### Python 示例代码 ```python def search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid if nums[left] <= nums[mid]: # 左半部分有序 if nums[left] <= target < nums[mid]: right = mid - 1 else: left = mid + 1 else: # 右半部分有序 if nums[mid] < target <= nums[right]: left = mid + 1 else: right = mid - 1 return -1 ``` ### JavaScript 示例代码 ```javascript function search(nums, target) { let left = 0; let right = nums.length - 1; while (left <= right) { let mid = Math.floor((left + right) / 2); if (nums[mid] === target) { return mid; } if (nums[left] <= nums[mid]) { // 左半部分有序 if (nums[left] <= target && target < nums[mid]) { right = mid - 1; } else { left = mid + 1; } } else { // 右半部分有序 if (nums[mid] < target && target <= nums[right]) { left = mid + 1; } else { right = mid - 1; } } } return -1; } ``` 这些示例代码都遵循了相同的逻辑:通过二分查找来缩小搜索范围,并根据当前中间元素与目标值的关系,以及左右两边是否有序,来决定是继续在左半部分查找,还是在右半部分查找。
推荐面试题