首页 > 其他分享 >返回数组中的局部最小

返回数组中的局部最小

时间:2022-12-13 00:34:35浏览次数:42  
标签:arr 局部 元素 最小 mid 数组

返回数组中的局部最小

局部最小的定义:

所谓局部最小就是比它右边小同时也要比它左边小,如果是数组的第一个元素那么只需要比它下一个元素小也就是局部最小,如果是最后一个元素那么只需要比它上一个元素小就是局部最小,如果仅仅包含两个元素那么谁小谁就是局部最小。

注意:

这样的数组要整体无序且相邻数组元素不相等。

代码:

/**
 * 返回一个数组中的局部最小的数组元素的下标值
 * 所谓局部最小就是这个数组元素比它左边的小同时也比它右边的小
 * 注意:二分查找不一定非要数组有序
 */
public class JuBuMin {
    // arr 整体无序
    // arr 相邻的数不相等!
    public static int oneMinIndex(int[] arr) {
        if (arr == null || arr.length == 0) {
            return -1;
        }
        int N = arr.length;
        //如果数组就一个元素那这个元素就是局部最小
        if (N == 1) {
            return 0;
        }
        //边界情况就是如果第一个数组元素比它右边的数组元素小那么它就是局部最小
        if (arr[0] < arr[1]) {
            return 0;
        }
        /*
        下面可包含两种情况:
        1:边界情况就是数组元素最右边的值如果小于倒数第二个值那么它就是局部最小
        2:当数组元素有两个值的时候结合上面这个if也可以进行判断局部最小
         */
        if (arr[N - 1] < arr[N - 2]) {
            return N - 1;
        }
        int L = 0;
        int R = N - 1;
        // L...R 肯定有局部最小
        while (L < R - 1) {
            int mid = (L + R) / 2;
            if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1]) {
                //如果既小于左边又小于右边的话那它就是局部最小
                return mid;
            } else {
                if (arr[mid] > arr[mid - 1]) {
                    //如果比它左边的值大那么就在左边继续找
                    R = mid - 1;
                } else {
                    //如果比它左边的值小那么就在右边继续找
                    L = mid + 1;
                }
            }
        }
        return arr[L] < arr[R] ? L : R;
    }

标签:arr,局部,元素,最小,mid,数组
From: https://www.cnblogs.com/ygstudy/p/16977527.html

相关文章

  • 第一百一十二篇: JS数组Array(一)数组基本用法
    好家伙, 1.数组 Array应该就是ECMAScript中最常用的类型了。ECMAScript数组跟其他编程语言的数组有很大区别。跟其他语言中的数组一样,ECMAScript数组也是一组有序的......
  • 代码随想录训练营第六天|LeetCode242有效的字母异位词、LeetCode349两个数组的交集、L
    LeetCode242有效的字母异位词tag:#哈希表#数组leetcode地址:242. 有效的字母异位词代码://通过数组的方式对每个字母进行统计数量,然后遍历数组,查看是否每一项都为0f......
  • java 数组实现队列
     算法题用数组实现队列,三个函数,分别是添加add(),出队poll()和获取队中的元素个数getSize()当队的元素满的时候进行二倍的扩容。classmyqueue{privateint[]date;......
  • 数据结构之数组
    1.数组实现数组的特点:内存是连续的,即物理地址是连续的。优点:随机访问的时间复杂度为O(1);末尾位置增加元素的时间复杂度为O(1);访问元素前后相邻位置的元素非常方便......
  • 【LeetCode】二分法--剑指 Offer 53 - I. 在排序数组中查找数字 I
    点击直达题目内容统计一个数字在排序数组中出现的次数。示例示例1:输入:nums=[5,7,7,8,8,10],target=8输出:2示例2:输入:nums=[5,7,7,8,8,10],target......
  • 局部敏感哈希-Locality Sensitive Hashing-LSH
    问题定义对于一个给定的query,从数据库中召回所有dist<thres的docs。问题求解Naive的方法需要O(n)的时间复杂度,LSH只需要O(1)即可实现。具体来说分为三步:1)抽取Embeddin......
  • 数组的活学活用(一)
    概览数组我们知道,是一种有序连续的数据结构,随机访问的效率高。之所以随机访问的效率高,就是因为它的每个值都有下标,可以根据下标直接找到我们想要的值。 既然我们已经......
  • Shell数组基本概述
    1.数组基本概述01.什么是数组?数组其实也算是变量,传统的变量只能存储一个值,但数组可以存储多个值。02.数组的分类Shell数组分为普通数组和关联数组。普通数组:只能使......
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II(状态转移 位运算)
      ​​剑指Offer56-II.数组中数字出现的次数II​​难度中等38在一个数组 ​​nums​​ 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次......
  • 剑指offer 数组中的逆序对(归并排序)
    ​​剑指Offer51.数组中的逆序对​​难度困难176在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的......