【算法】【算法杂谈】旋转数组的二分法查找

这篇具有很好参考价值的文章主要介绍了【算法】【算法杂谈】旋转数组的二分法查找。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
给定一个从小到大有序的数组,该数组存在重复的数,并且该数组可能经过旋转处理,如arr = [1,2,3,4,5,6,7]代表数组未旋转,如果arr=[4,5,6,7,1,2,3],则表示该数组被旋转了,求该数组中的最小值

解决方案

原问题
首先有一个规律,如果该数组没有被旋转,那么arr[0] 一定小于arr[n-1],否则一定是旋转过的
【算法】【算法杂谈】旋转数组的二分法查找
没有重复的情况如上
=【算法】【算法杂谈】旋转数组的二分法查找【算法】【算法杂谈】旋转数组的二分法查找
当l = mid = r相同时:
【算法】【算法杂谈】旋转数组的二分法查找【算法】【算法杂谈】旋转数组的二分法查找

比较极端的情况,但是仍然是递增数组
【算法】【算法杂谈】旋转数组的二分法查找

具体代码请看代码逻辑处理

代码编写

java语言版本

原问题:
方法一:



    /**
     * 二轮测试:旋转数组的二分法查找
     * @param arr
     * @return
     */
    public static int getMinCp1(int[] arr) {
        if (arr == null || arr.length == 0) {
            return 0;
        }
        int low = 0;
        int mid = 0;
        int high = arr.length - 1;
        while (low < high) {
            if (low == high - 1) {
                break;
            }
            if (arr[low] < arr[high]) {
                return arr[low];
            }
            mid = (low + high) / 2;
            if (arr[low] > arr[mid]) {
                high = low;
                continue;
            }
            if (arr[low] < arr[mid]) {
                low = mid;
                continue;
            }
            while (low < mid) {
                if (arr[low] < arr[mid]) {
                    return arr[low];
                }else if (arr[low] == arr[mid]) {
                    low++;
                    continue;
                }else {
                    high = mid;
                    break;
                }
            }
        }
        return Math.min(arr[low], arr[high]);
    }


    public static void main(String[] args) {
        System.out.println(getMinCp1(new int[] {1,2,3,4,5}));
    }


c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

看完解法,说实话我想用O(n)的解法[苦笑],要分析的情况真的挺复杂,不如直接使用O(N)的解法问题,并且在l=mid=r的情况下仍然存在循环找数字的情况,可以作为分析娱乐来,但不建议加到业务代码中。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!文章来源地址https://www.toymoban.com/news/detail-459458.html

到了这里,关于【算法】【算法杂谈】旋转数组的二分法查找的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【二分查找】一文带你掌握二分法 (附万能模板)

    一、简介 哪怕没有学过编程的同学,也许不知道二分法这个名字,但也一定接触过它的核心思想。不了解的同学也没关系,我用一句话就能概括出它的精髓: 将一个区间一分为二,每次都舍弃其中的一部分。 二分法能够极大地降低我们在解决问题时的时间复杂度。假如你要

    2024年01月19日
    浏览(58)
  • 超详解“二分法查找”,一看就会!

    目录 一、 二分法概念用途 二、 超详思维图解 三、  超详使用方法实现代码运行操作 四、   总结 五、   结语 一:二分法概念用途  什么是二分法?有什么作用?一般用在何处? 概念: 二分查找法算法,也叫折半查找算法(对半处理会提高寻找目标数字的效率); 作用

    2024年02月07日
    浏览(66)
  • 【算法】—二分法详解

    ①定义: 二分查找算法也称折半搜索算法,对数搜索算法,是一种在 有序数组 中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素

    2024年02月09日
    浏览(52)
  • 06-C++ 基本算法 - 二分法

    在这个笔记中,我们将介绍二分法这种基本的算法思想,以及它在 C++ 中的应用。我们将从一个小游戏猜数字开始,通过这个案例来引出二分法的概念。然后我们将详细讲解什么是二分法以及它的套路和应用。最后,我们还会介绍 C++ STL 中的二分查找函数。让我们一起来探索

    2024年02月16日
    浏览(45)
  • 算法:二分法---寻找H指数

    1、题目: 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数 。 根据维基百科上 h 指数的定义: h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用

    2024年02月08日
    浏览(44)
  • 【算法训练-数组 五】【二分查找】:旋转排序数组的最小数字、旋转排序数组的指定数字

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【数组的二分查找】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两

    2024年02月09日
    浏览(50)
  • 二分法MATLAB代码

    本质是通过不断进行区间压缩来获取函数零点。 二分法的终止条件:区间长度小于等于精度要求 。 流程: 如下图所示:

    2024年02月05日
    浏览(46)
  • 二分法相关使用

    在线OJ:704. 二分查找 有序数组下的二分思路如下: 由于这里是有序数组, 我们可以可以先得到中点位置, 中点可以把数组分为左右两边; 如果中点位置的值等于目标值, 直接返回中点位置; 如果中点位置的值小于目标值, 则去数组中点左侧按同样的方式查找; 如果中点位置的值大

    2024年02月07日
    浏览(43)
  • 二分法简单题

    2024年01月24日
    浏览(55)
  • 初探二分法

    智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 提示: 你可以

    2024年01月25日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包