Skip to content

Latest commit

 

History

History
64 lines (54 loc) · 1.97 KB

33_搜索旋转排序数组.md

File metadata and controls

64 lines (54 loc) · 1.97 KB

33.搜索旋转排序数组

问题

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是O(logn) 级别。

示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

解答

仍然利用二分搜索,只不过搜索的过程比较麻烦。一般来说,分为三种情况。

  • 第一种,[8,9,1,2,3,4,5],类似于这种,右边部分比较长。根据target和nums[right]和nums[mid]的关系来决定往哪边走。
  • 第二种,和上面相反,左边部分比较长,所以根据target和nums[left]和nums[mid]的关系来决定怎么走。
  • 第三种情况,就是完全升序,就是普通的二分搜索了。
class Solution {
public:
    
    int search(vector<int> &nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            
            if (nums[mid] > nums[right]) {
                if (target < nums[mid] && target >= nums[left]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else if (nums[mid] < nums[left]) {
                if (target > nums[mid] && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            } else {
                if (target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            }
        }
        return -1;
    }
};