【问题标题】:For each number in an array, find the first smaller number from the left of it对于数组中的每个数字,找到它左边的第一个较小的数字
【发布时间】:2019-11-14 18:37:54
【问题描述】:

我已经考虑这个问题好几个小时了,到目前为止我的每一个想法都不好。

执行此操作的函数接收原始数组和需要填充的空数组。

如果某个对象没有这样的索引,则应该插入-1。

例如,对于数组:[4,6,8,1,7,10,15,9,11] 数组 [-1,0,1,-1,3,4,5,4, 7] 应该返回,因为例如如果我们查看原始数组中的 9,它的左起第一个较小的数字是 7,而 7 的索引是 4。因此,应该用 4 代替原始数组中的 9填写新的。

如果原始数组的大小为n,我的时间复杂度为O(n),空间复杂度也为O(n)。

您只能使用数组或列表来寻求帮助,而不能使用其他结构。

这是我迄今为止收集到的信息: 1. 对数组进行排序,隐式做的解决方案还不够好。

  1. 如果我们开始从左到右查看数组,一旦我们发现一个小于其他数字的数字,“其他”数字就可以被扔掉。我认为这是最重要的,但我无法使用它。

  2. 将原始数组划分为已排序的迷你数组不会有帮助。

【问题讨论】:

  • 我不明白反对意见。我没有一个可以让我开始的想法,因此我寻求帮助,并且问题说得很清楚。
  • 我不是投反对票的人,但一般来说,您需要展示您已经尝试过的内容,以便人们帮助您。

标签: arrays algorithm time-complexity


【解决方案1】:

制作一个堆栈(基于数组或列表:))。它将保留候选元素的索引。

遍历源数组。

如果当前元素大于堆栈顶部寻址的元素,则将堆栈顶部复制到输出数组并将当前索引压入堆栈。

如果栈顶寻址的元素较大,则弹出堆栈,直到找到较小的元素。

我省略了一些需要自己实现的时刻。

请注意,堆栈在每一刻都包含递增序列的索引。

【讨论】:

  • 我有一个非常相似的想法,但没有注意到它会足够好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多