首页 > 其他分享 >局部最小问题(二分查找)

局部最小问题(二分查找)

时间:2023-12-19 11:24:02浏览次数:31  
标签:二分 target 局部 mid 最小 查找

二分查找

局部最小问题

思路来源

一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础

笔记内容

  • 问题描述:

    对于一个数组,相邻值不等。查找出该数组中满足局部最小的值。

    局部最小:

    1. x[0]<x[1] 2
    2. x[n-1]<x[n-2]
    3. x[i-1]>x[i] && x[i+1]>x[i]
  • 算法思路:

    1. 首先检测首尾是否满足局部最小,若满足则查找成功,退出算法;
    2. 若均不满足,则在数组首部为局部下降,在尾部为局部上升,数组中必存在一个拐点满足局部最小,使用二分法查找。
    3. 对于查找段,首先判断mid是否满足条件,满足则直接返回,结束算法。
    4. 若判断不满足局部最小条件,则继续进行二分,通过判断下一二分查找段两端是否满足必存在拐点的条件,选择其中一段进行查找。
public class LocalMinimum {
    /**
     * 二分查找
     * 局部最小
     * */
    public static void main(String[] args) {
        int[] target = {7,6,3,2,7};
        int length = target.length;
        //首尾判断
        if(target[0]<target[1]){
            System.out.println(target[0]);
        }else if(target[length-1]<target[length-2]){
            System.out.println(target[0]);
        }else {
            getResult(target,0,length-1);
        }
    }

    public static void getResult(int[] target,int left,int right){
        int mid = left+(right-left)/2;
        if(target[mid]<target[mid+1] && target[mid]<target[mid-1]){
            System.out.println(target[mid]);
            return;
        }
       if(target[mid]<target[mid+1] && target[left]> target[left+1]){
           getResult(target,left,mid);
       }
        if(target[mid]>target[mid+1] && target[right]> target[right-1]){
            getResult(target,mid,right);
        }
    }
}

标签:二分,target,局部,mid,最小,查找
From: https://www.cnblogs.com/nouleeee/p/17913264.html

相关文章

  • 【算法模版】二分查找
    1.简介故事分享......
  • 【分治查找数组的最大次大元素】
    分治算法介绍分治算法是一种将问题分解成更小子问题,解决子问题,然后将它们的结果合并以解决原始问题的方法。对于查找数组的最大和次大元素,我们可以将数组分成两部分,然后分别查找每个子数组的最大和次大元素,最后将这些结果合并以得到原始数组的最大和次大元素。算法步骤如果数......
  • 自动化查找并记录含图片文件夹的Python脚本
    功能介绍此Python脚本用于遍历指定的父目录,自动识别并记录所有包含图片文件(如PNG、JPG、GIF等格式)的子文件夹。脚本运行后,将在父目录下生成一个名为“文件夹名统计”的Excel表格,其中列出了所有含有图片的文件夹名称。这对于整理大量分散在不同子文件夹中的图片文件特别有用,尤其是......
  • Arrays工具类二分查找方法binarySearch方法详解​
    Arrays工具类二分查找方法binarySearch方法详解基础知识该方法的一般形式是publicstatic<T>intbinarySearch(T[]a,Tkey),对于基本类型,都有相应的重载方法,如针对int类型有binarySearch(int[]a,intkey)等。该方法的原理是使用二分查找算法在指定的数组中搜索指定的值。在调......
  • 二分查找细节分析
    二分查找细节分析本篇仅分析二分查找的细节问题,在阅读前请确保已经对“二分查找”概念与步骤有初步了解。二分查找的三个常用搜索区间搜索区间终止条件左右指针初始赋值左右指针赋值循环条件左闭右闭[l,r]相错终止l=0r=nums.length-1l=mid+1r=mid-1l<=r......
  • P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    首先最大公因数和最小公倍数之积等于两个原数的积,这是基本性质然后两个数中,最小也是大于等于最大公因数,最大不超过最小公倍数最暴力的方法是,在这个范围内遍历其中一个数,积除以这个数得到另一个数,然后用辗转相除法进行判断就可以求解。当然,可以缩短范围。缩短范围有两个基本思想......
  • [LeetCode] LeetCode373. 查找和最小的K对数字
    题目描述思路:大顶堆+翻转注意:该题有问题,代码可以通过测试用例。方法一:classSolution{publicList<List<Integer>>kSmallestPairs(int[]nums1,int[]nums2,intk){PriorityQueue<Node>heap=newPriorityQueue<>((e1,e2)->e2.sum-e1.sum);......
  • linux查找文件
    linux查找文件常用的有find和whereis两种方式.find适用于复杂的查询,指定目录和文件名,通常可以找到你想要的文件.不要指定从根目录开始找,与其这样不如先推测一下这个文件可能在什么地方.whereis通常用来定位二进制文件,帮助文件,源码文件,默认情况下是在包管理......
  • 二分图最大匹配和二分图最大权完美匹配
    二分图最大匹配和二分图最大权完美匹配二分图最大匹配题目描述对于一个二分图,求其最大匹配的边数(任意一个点只能匹配另一个点)算法解析使用匈牙利算法。遍历每一个左部点,若发现它所连到的右部点中有未被匹配的点就选择连接;若右部点已被匹配,就询问匹配该右部点的点能否更换至另......
  • 最小树形图学习笔记
    最小树形图学习笔记退役前想学但没时间学的uselessalgorithm,退役后找时间都学掉。这是其中之一。有向图上的最小生成树称为最小树形图(DirectedMinimumSpanningTree)。本文默认树形图为外向树,即除根以外的所有点的入度为\(1\),根的入度为\(0\)。最小树形图问题即求一个有......