旋转数组查找数字--力扣101算法题解笔记

4.4旋转数组查找数字

题目描述

一个原本增序的数组被首尾相连后按某个位置断开(如【1,2,2,3,4,5】->【2,3,4,5,1,2】为在第一位和第二位断开),我们称其为旋转数组。给定一个值,判断这个值是否存在于这个旋转数组中

输入输出样例

Input:nums = 2,5,6,0,0,1,2, target = 0

Output:true

输入一个数组和一个值,输出一个bool值。

题解

跟之前的题目大差不差,是类似两个数组都是递增的然后拼接一块。不过这个题里面的两个数组都是有序的且把这两个小数组拼接在一起也是有序的。所以仍然可以使用二分查找。对于当前的中点,如果它指向的值小于等于右端,那么就说明右边排好序了,反之,左边排好序。如果target在排好序的区间里了,那就可以在区间里进行二分查找。反之,对另一半的区间查找。

这里面有个小问题,就是可能数组存在重复的数组,要是中点和左端数字相同,就不能确定左右的数组情况,没准都是相同数字,也没准左边的小数组都跟中点相同。这个时候就给左端点向右移动一个,也不耽误整体的二分查找。因为他跟中点相同。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

bool search(vector<int>& nums, int target) {
    int start = 0, end = nums.size() - 1;
    while (start <= end) {
        int mid = start + (end - start) / 2;
        if (nums[mid] == target) {
            return true;
        }
        if (nums[start] == nums[mid]) {
            //不知道哪个区间是增序
            ++start;
        }
        else if(nums[mid] <= nums[end]) {
             //右区间是增序
            if (target > nums[mid] && target <= nums[end]) {
                start = mid + 1;
            }
            else {
                end = mid - 1;
            }
        }
        else {
            //左区间是递增的
            if (target >= nums[start] && target < nums[mid]) {
                end = mid - 1;
            }
            else {
                start = mid + 1;
            }
        }
    }
    return false;
}

int main() {
    vector<int> nums = { 5,7,7,8,8,10 };
    int target = 8;

    if (search(nums, target)) {
        cout << "true" << endl;
    }
    else {
        cout << "false" << endl;
    }

    return 0;
}
相关推荐
HugoStudio_SWAN1 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆2 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
阳明山水3 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技3 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
wuyk5553 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
-dzk-3 小时前
【链表】LC 138.随机链表的复制
数据结构·链表
Tongzhi20263 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
eBest数字化转型方案4 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
洋不写bug4 小时前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
residual_fan4 小时前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析