【C++】33 搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

#include <iostream>
#include <vector>

using namespace std;

int search(vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size() - 1;
    
    while (left <= right) {
        int mid = left + (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; // 没找到目标值
}

int main() {
    vector<int> nums = {4, 5, 6, 7, 0, 1, 2};
    int target = 0;
    
    int result = search(nums, target);
    
    if (result != -1) {
        cout << "Target " << target << " found at index: " << result << endl;
    } else {
        cout << "Target " << target << " not found in the array." << endl;
    }
    
    return 0;
}

采用修改过的二分查找算法来查找目标值 target 在旋转后的有序数组 nums 中的位置。具体步骤如下:

  1. 初始化左右边界 left 和 right 分别为数组的起始和结束位置。 在循环中,计算中间位置 mid。 如果中间位置的值
  2. nums[mid] 等于 target,则直接返回 mid。 如果左半部分有序(即 nums[left] <= nums[mid]),则判断 target 是否在左半部分,如果是,则将搜索范围缩小到左半部分;否则,搜索右半部分。
  3. 如果右半部分有序(即 nums[left] > nums[mid]),则判断 target 是否在右半部分,如果是,则将搜索范围缩小到右半部分;否则,搜索左半部分。
  4. 不断缩小搜索范围,直到找到目标值或者确定不存在,返回相应的结果。

这个算法的时间复杂度为 O(log n),因为每次迭代都将搜索范围减半,直到找到目标值或者搜索范围为空。

相关推荐

  1. C++】33 搜索旋转排序数组

    2024-04-26 23:48:01       17 阅读
  2. 33.搜索旋转排序数组

    2024-04-26 23:48:01       42 阅读
  3. LeetCode 33 搜索旋转排序数组

    2024-04-26 23:48:01       40 阅读
  4. LeetCode 33. 搜索旋转排序数组

    2024-04-26 23:48:01       36 阅读
  5. 【Leetcode】33- 搜索旋转排序数组

    2024-04-26 23:48:01       12 阅读
  6. leetCode33. 搜索旋转排序数组

    2024-04-26 23:48:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-26 23:48:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-26 23:48:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-26 23:48:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-26 23:48:01       20 阅读

热门阅读

  1. nodejs

    nodejs

    2024-04-26 23:48:01      15 阅读
  2. 【动态规划】Leetcode 32. 最长有效括号【困难】

    2024-04-26 23:48:01       12 阅读
  3. 启动MySQL服务

    2024-04-26 23:48:01       15 阅读