在旋转有序数组内找特定的值

简介:

要求

      给定一没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1)。

例如

有序数组为{0,1,2,4,5,6,7},它的一个旋转数组为{4,5,6,7,0,1,2}。

  • 元素6在旋转数组内,返回2
  • 元素3不在旋转数组内,返回-1

 

分析

      遍历一遍,可以轻松搞定,时间复杂度为O(n),因为是有序数组旋转得到,这样做肯定不是最优解。有序,本能反映用二分查找,举个例子看看特点

      可以看出中间位置两段起码有一个是有序的(不是左边,就是右边),那么就可以在有序的范围内使用二分查找;如果不再有序范围内,就到另一半去找。

 

参考代码

复制代码
    int search(int A[], int n, int target) {
        int beg = 0;
        int end = n - 1;
        while (beg <= end)
        {
            int mid = beg + (end - beg) / 2;
            if(A[mid] == target)
                return mid;
            if(A[beg]  <= A[mid])
            {
                if(A[beg] <= target && target < A[mid])
                    end = mid - 1;
                else 
                    beg = mid + 1;
            }
            else
            {
                if(A[mid] < target && target <= A[end])
                    beg = mid + 1;
                else
                    end = mid - 1;
            }
        }
        return -1;
    }
复制代码

 

 

扩展

      上边的有求是没有重复的元素,现在稍微扩展下,可以有重复的元素,其他的要求不变。

 

思路

      大致思路与原来相同,这是需要比较A[beg] 与 A[mid]的关系

  • A[beg]  < A[mid] ————左边有序
  • A[beg]  > A[mid] ————右边有序
  • A[beg]  = A[mid] ————++beg
复制代码
    bool search(int A[], int n, int target) {
        int beg = 0;
        int end = n - 1;
        while (beg <= end)
        {
            int mid = beg + (end - beg) / 2;
            if(A[mid] == target) 
                return true;
            if(A[beg] < A[mid])
            {
                if(A[beg] <= target && target < A[mid])
                    end = mid - 1;
                else
                    beg = mid + 1;
            }
            else if(A[beg] > A[mid])
            {
                if(A[mid] < target && target <= A[end])
                    beg = mid + 1;
                else
                    end = mid - 1;
            }
            else
                ++beg;
        }
        return false;
    }
复制代码

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3687583.html,如需转载请自行联系原作者

相关文章
|
6天前
|
人工智能 运维 安全
|
3天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
499 14
|
11天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
868 109
|
4天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。