首页 > 其他分享 >搜索旋转排序数组

搜索旋转排序数组

时间:2023-06-19 17:56:29浏览次数:42  
标签:数组 nums int mid 搜索 有序 排序 target

33.搜索旋转排序数组

题目描述

image

题解

为了设计一个复杂度为 \(O(logn)\) 的算法,可以采用二分的思想,但是题给数组只是一个部分有序的数组,更准确一点,应该是两个有序数组拼接而成的部分有序数组,唯一出现乱序的地方就是两个数组的拼接处。为了使用二分查找算法,我们必须确定中位点mid位于哪一个有序数组中。这里提供一个简单的思路,我们将nums[mid]nums[0]作比较,由于数组中的元素互不相等,因此:

1.nums[mid] > nums[0]:那么左半部分[left, mid-1]有序
2.nums[mid] < nums[0]:那么右半部分[mid+1, right]有序

如果target==nums[mid],查找成功,退出。

在上述条件1的情况下,如果:target的值介于[nums[0], nums[mid]) 之间,则往左半部分遍历,否则往右半部分遍历。

在上述条件2的情况下,如果:target的值介于(nums[mid], nums[n-1]] 之间,则往右半部分遍历,否则往左半部分遍历。
代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) 
    {
        int n = (int)nums.size();
        if (!n) return -1;
        
        if (n == 1) return nums[0] == target ? 0 : -1;
        
        int l = 0, r = n - 1;
        while (l <= r) 
        {
            int mid = (l + r) / 2;
            if (nums[mid] == target) return mid;
            //[0, mid-1]有序
            if (nums[0] <= nums[mid]) 
            {
                if (nums[0] <= target && target < nums[mid]) 
                {
                    r = mid - 1;
                } 
                else 
                {
                    l = mid + 1;
                }
            } 
            //[mid+1, n-1]有序
            else 
            {
                if (nums[mid] < target && target <= nums[n - 1]) 
                {
                    l = mid + 1;
                } 
                else 
                {
                    r = mid - 1;
                }
            }
        }
        return -1;
    }
};

该题的思想在于:每次二分时,将一个较大的部分有序的数组转化为一个较小的有序数组和一个较小的部分有序数组。

标签:数组,nums,int,mid,搜索,有序,排序,target
From: https://www.cnblogs.com/parallel-138/p/17491778.html

相关文章

  • 截取某列数组元素里的一部分成为一个新列数组
    参考: https://www.coder.work/article/3220624  spark2.4的新方法Spark2.4引入了新的SQL函数 slice,可用于从数组列中提取一定范围的元素。 ......
  • 数据结构课程设计2023夏7-11 二路归并排序
    给定一个整数序列,请按非递减序输出采用二路归并排序(递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。输入格式:测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。输出格式:对于每组测试,输出若干行,每行是一趟排序后的......
  • 189. 轮转数组
    题目:思路:【1】如果采用辅助空间(这种是最简单的,因为需要遍历一遍,然后放入指定位置)【2】对于进阶的处理,即只用空间复杂度为O(1)【2.1】利用环的思维其实这里需要理解一个比较绕的逻辑就是从X位置开始循环,到回到X位置到底遍历了多少个元素已知数组的元素个数是n,偏移量为k(这......
  • 数组的动态内存分配
     假设我们要为一个字符数组(一个有20个字符的字符串)分配内存,我们可以使用上面实例中的语法来为数组动态地分配内存,如下所示:char*pvalue=NULL;//初始化为null的指针pvalue=newchar[20];//为变量请求内存要删除我们刚才创建的数组,语句如下:delete[]pvalue;//......
  • 20230406 9.2. 希尔排序( by Donald Shell )
    希尔排序(byDonaldShell)定义增量序列\(D_M>D_{M-1}>…>D_1=1\)对每个\(D_k\)进行\(D_k-间隔\)排序(k=M,M-1,…1)注意:\(D_k-间隔\)有序的序列,在执行\(D_{k-1}-间隔\)排序后,仍然是\(D_k-间隔\)有序的希尔增量序列原始希尔排序$D_M=N/2$......
  • js数组常用的方法
    在JavaScript中,数组是一种非常重要的数据类型。数组提供了一系列常用的方法,可以方便地对数组进行操作和处理。本文将介绍JavaScript中几种常用的数组方法的含义、返回值以及是否改变原数组。一、push()push()方法可以将一个或多个元素添加到数组的末尾,并返回数组的新长度。例如:......
  • 共享库搜索路径
    基本原理-L编译选项是编译期间使用LD_LIBRARY_PATH环境变量是运行期间使用,可以用来指定so的加载路径,并且优先级高于系统默认的。RPATH和RUNPATH是ELF格式里面的一个数据,rpath编译选项实际上是在可执行文件中加入了RUNPATH或者RPATH。小结一下一个ELF文件自身加载so的情况(不......
  • 2023-06-18:给定一个长度为N的一维数组scores, 代表0~N-1号员工的初始得分, scores[i] =
    2023-06-18:给定一个长度为N的一维数组scores,代表0~N-1号员工的初始得分,scores[i]=a,表示i号员工一开始得分是a,给定一个长度为M的二维数组operations,operations[i]={a,b,c}。表示第i号操作为:如果a==1,表示将目前分数<b的所有员工,分数改成b,c这个值无用,如果a==2,表示将......
  • 【10篇热门博客文章】语音搜索技术在人工智能中的应用与发展趋势
    目录语音搜索技术在人工智能中的应用与发展趋势摘要:随着语音交互技术的不断发展,语音搜索技术在人工智能中的应用越来越广泛。本文从语音搜索技术的原理、实现步骤、应用示例和优化改进等方面进行论述,旨在为读者提供更深入、更全面的理解。文章还总结了语音搜索技术在人工智能领......
  • 微信小程序更改刷新data 数组结构里的某一项数据
    如果每次setData 中list整个数组,感觉会消耗性能,所以只需要setData刷新对应的item  只需要通过以下方式解决    this.setData({'array[0].text':'updatedata'})//如果索引是动态的则使用下方方式varmMessage='array['+index+'].text';this.set......