当前位置: 首页 > 知识库问答 >
问题:

最短未排序连续子数组:为什么我们从数组的末尾开始?

艾焕
2023-03-14

(cmp.https://leetcode.com/problems/shortest-unsorted-continuent-subarray/)。

我仍然停留在这个问题的主要方法上。它把我的头一分为二。

假设我们有这个给定的数组:

[1,2,5,3,7,10,9,12]

输入:[1,2,5,3,7,10,9,12]->

maxes:[1,2,5,5,7,10,10,12]

其中索引0是“1”,因为“1”是在该索引之前找到的“最大”值。索引1是“2”,因为“2”是到该索引为止的“最大”值。以此类推。

如果我从左边开始,它就变成了1。

我应该从末尾(右)开始吗?如果我这样做了,为什么我必须在最后开始呢?

共有1个答案

韩禄
2023-03-14

你的方法看起来一般不错。您需要向后工作来构造mins数组,这是正确的。原因是,与在maxes数组中向前“传播”当前最大值的方式相同,在mins数组中从末尾向后“传播”当前最小值。

考虑输入数组[2,3,5,1,12,7,10,9,11],其构建方式使得最短的未排序连续子数组是整个数组本身。

如果使用您的方法,可以看到最大值将12从中间“推”到最后,最小值将1从中间“推”到开始。

Index    0  1  2  3  4  5  6  7  8

Input  [ 2, 3, 5, 1,12, 7,10, 9,11]
 
Maxes  [ 2, 3, 5, 5,12,12,12,12,12]
                                 ^
                             maxes_idx

Mins   [ 1, 1, 1, 1, 7, 7, 9, 9,11] 
         ^   
      mins_idx    
Index    0  1  2  3  4  5  6  7

Input  [ 1, 2, 5, 3, 7,10, 9,12]
 
Maxes  [ 1, 2, 5, 5, 7,10,10,12]
                           ^
                         maxes_idx

Mins   [ 1, 2, 3, 3, 7, 9, 9,12] 
               ^   
            mins_idx    
    null
Index    0  1  2  3  4  5  6  7

Input  [ 1, 2, 5, 3, 7,10, 9,12]
 
Sorted [ 1, 2, 3, 5, 7, 9,10,12]
               ^           ^ 
         lower_idx       upper_idx

从末尾查找最后一个索引j,它违反了排序数组的条件(即input[j-1]>input[j])

Index    0  1  2  3  4  5  6  7

Input  [ 1, 2, 5, 3, 7,10, 9,12]
               ^           ^ 
              i=2         j=6

在这两个索引之间的子数组中,查找最小和最大元素

min_ij([5, 3, 7,10, 9]) = 3
max_ij([5, 3, 7,10, 9]) = 10

如果子数组的最小元素大于之前的所有元素,则找到i(示例中就是这种情况)。否则,将i更新到完整数组中第一个元素的索引,该元素大于min_ij

 类似资料:
  • 问题内容: 这是一段C ++代码,显示了一些非常特殊的行为。由于某些奇怪的原因,奇迹般地对数据进行排序使代码快了将近六倍: 不使用std::sort(data, data + arraySize);,代码将在11.54秒内运行。 使用排序的数据,代码将在1.93秒内运行。 最初,我认为这可能只是语言或编译器异常,所以我尝试了Java: 具有类似但不太极端的结果。 我首先想到的是排序将数据带入缓存,

  • 问题内容: 在有关reshape()函数的numpy手册中,它说 我的问题是: 什么是连续和不连续数组?它类似于C中的连续内存块,例如什么是连续内存块? 两者之间在性能上有什么区别吗?我们什么时候应该使用其中一个? 为什么转置会使数组不连续? 为什么会c.shape = (20)引发错误incompatible shape for a non-contiguous array? 感谢您的回答! 问

  • NowCoder 题目描述 {6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 解题思路 // java public int FindGreatestSumOfSubArray(int[] nums) { if (nums == null || nums.length == 0) return 0;

  • 题目描述 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值,要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。 分析与解法 解法一 求一个数组的最大子数组和,我想最直观最野蛮的办法便是,三个f

  • 一、题目 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例子说明: 例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}。因此输出为该子数组的和18 。 二、解题思路 解法一:举例分析数组的规律。 我们试着从头到尾逐个累加示例数组中的每个

  • 我有2列制表符分隔的整数,其中第一列是随机整数,第二列是标识组的整数,可以由此程序生成。() 然后,我使用第二个程序()计算每个组的和。 如果我在给定大小的数据集上运行这些程序,然后打乱相同数据集的行的顺序,打乱的数据计算总和的速度比有序数据快2倍或更多。 我本来希望按组排序的原始数据具有更好的数据局部性并且速度更快,但我观察到相反的行为。我想知道是否有人可以假设原因?