- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序,其输入是一个整数数组及其大小。此代码必须删除小于左侧元素的元素。我们想要找到重复此操作以无法删除更多元素的次数。这是我的代码,它可以工作,但我希望它更快。
你有什么想法可以让这段代码更快,或者有比这更快的方法吗?
例如,给定数组 [10, 9, 7, 8, 6, 5, 3, 4, 2, 1],函数应该返回 2,因为 [10,9,7,8,6,5, 3,4,2,1] → [10,8,4] → [10]
int numberOfTimes(int array[] , int n) {
int count = 0;
int flag = 0;
int sizeCounter = 0;
while (true){
for (int i = 0; i < n-1; ++i) {
if (array[i]<= array[i+1]){
sizeCounter++;
array[sizeCounter] = array[i+1];
} else{
flag = 1;
}
}
if (flag == 0)
return count;
count++;
flag = 0;
n = (sizeCounter+1);
sizeCounter = 0;
}
}
最佳答案
这个问题可以使用“单调堆栈”在 O(n) 时间和 O(n) 空间内解决。
对于 array
的每个元素我们将找到删除元素所需的“ Action /回合”数。换句话说,必须经过多少圈,才能删除当前元素(含)和左边最近的较大元素之间的所有元素。
如果我们知道这个数字(我们称它为 turns
),那么我们就可以为我们的数组的所有元素找到这个值的最大值,并且我们将知道从数组中删除所有元素所需的轮数被删除。我们会有答案。
现在,我们如何找到 turns
值(value)?这很容易,如果我们有这些 turns
为当前元素左侧的所有元素计算的值。我们只是找到最近的大于当前元素的元素,并找到 turns
的最大数量。对于该元素和当前元素之间的每个元素。 IE。如果当前元素位于索引 i
,并且最近的更大元素位于索引 j
处( j < i
和 array[j] > array[i]
),turns[i] = max(turns[k]+1), for k in [j+1..i-1]
.
如果我们天真地这样做,找到 turns
对于每个元素都是 O(n)。幸运的是,很容易看出,当我们找到 j
时对于一些 i
, 我们永远不需要考虑 j
之间的元素和 i
以后再。记住,array[j] > array[i]
以及介于 j
之间的所有内容和 i
小于 array[i]
.我们正在寻找大于某个值的最接近的数组元素,因此,如果 array[i]
不是答案,整个[j+1..i-1]
范围也不是答案,我们可以直接转到j
.
考虑到这一点,我们到达了单调堆栈。而不是存储 turns
对于 array
的每个元素, 我们只为 array
的严格递减子序列存储它到目前为止我们已经访问过。
在向堆栈中添加新元素之前,首先我们需要移除所有小于当前元素的元素。然后堆栈的顶部将是我们的 array[j]
.
由于每个元素都被添加到堆栈并恰好被删除一次,所以找到 turns
的摊销成本对于每个元素是 O(1),所以整个算法是 O(n)。在最坏的情况下,堆栈的大小会增长到与数组相同的大小(如果 array
严格递减)。所以空间复杂度为O(n)。
这是代码(python):
array = [10, 9, 7, 8, 6, 5, 3, 4, 2, 1]
s = [] # monotonic stack of pairs (array[j],turns[j])
count = 0 # result: number of turns to delete all deletable elements
for el in array:
# initially assuming current element can be deleted
turns = 1
# peeking at the top of the stack
while len(s) > 0 and s[-1][0] <= el:
_,t = s.pop()
turns = max(t+1, turns)
# corner case: current element is the largest so far, cant be deleted
if len(s) == 0:
turns = 0
s.append( (el, turns) )
count = max(count, turns)
print(count)
测试:
[10, 9, 7, 8, 6, 5, 3, 4, 2, 1] → 2
[10, 9, 7, 8, 6, 5, 3, 4, 2, 1, 9] → 3
[10, 9, 7, 8, 6, 5, 3, 4, 2, 1, 11] → 2
[] → 0
[1, 2, 3] → 0
[1, 2, 3, 1] → 1
[10, 1, 2, 3, 4, 5] → 5
UPD:我刚刚阅读了评论,我想感谢@wLui155,他在我之前提出了相同的核心想法。
关于arrays - 删除小于数组左侧元素的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69635619/
我正在使用这段代码: border-right:0px solid #ddd; height:85px; box-shadow :5px 5px 10px 1px #eaeaea; 但我刚刚得到
我遇到的问题是将文本放在图像的左侧... HTML 和 CSS h2, social-hand { font-family: 'PT Sans', sans-serif; display: i
美好的一天 我今天的 CSS 很糟糕。我有 3 列 div(水平,这就是我使用 float 的原因),但我想将我的文本居中对齐,但在包含列 div 的左侧。 HTML:
在我的应用程序中,我在截取屏幕截图时在我的 Imageview 中获得了透明像素。如何剪切顶部、左侧、右侧 和 Imageview 的底部。我尝试了下面的代码但没有工作 Bitmap bitmap =
如何在左侧的以下 LinearLayout 内部添加边框,使其宽度为 5dp 并适合 LinearLayout 的整个高度? LinearLayout 的高度是动态的,这意味着有时它可以是 50dp
我是第一次做网站。我在使用下拉菜单时遇到问题。它正在向左侧移动。请帮助我处理代码,使其位于导航菜单的正下方,并且将鼠标悬停在其上时应该可见。提前致谢。 这是我的 CSS 代码: ul { li
我对 html 和 css 有点生疏,我无法让 2 个图像 float ,一个在另一个之上。这是代码...   &nbs
我有一个固定宽度 (px) 的左侧边栏,右侧是我的主要内容。 这是我的演示:http://jsfiddle.net/fxWg7/4031/ 代码如下: 这是我的 html 代码: left co
所以我正在尝试做一个弹出式菜单,但我遇到了一点问题。 我已经申请了: .menu-side, .menu { -webkit-transition: left 0.2s ease; -
在下面的 CSS @media screen and (max-width: 750px) { .flexbox { display: block; } .menu ul {
@import 'https://fonts.googleapis.com/css?family=PT+Sans'; * { font-family: 'PT Sans', sans-serif
我想在我的标题旁边放一个图标。但它不合适..我怎样才能让它合适? My heading 最佳答案 使用vertical-align:middle,因此如果您更改文本或图像的大小,位
我正在使用参数方程围绕一个圆定位图像 ( How do I calculate a point on a circle’s circumference? ) 我使用简单的数学方法以更少的方式完成此操作
我想使用外部列表属性将 ul 列表正确定位在左浮动 img 的右侧,但元素符号未在图像右侧对齐,因为没有任何图像,但更多在左边。 Lorem ipsum dolor sit amet, c
我有一个layer-list.xml 现在我想在运行时更改 (top,right) 等项目的
我通过按:M-x linum-mode 来启用它们。如何将其“翻译”到 my.emacs 文件中,以便每次打开 EMACS 时自动启用它? 最佳答案 如果您希望每个缓冲区都使用它,请将 (global
我的Code : HTML 1 2 3 CSS #score { height:50px; } .myDiv { width:40px; height:40px;
我可以轻松设置 canvas.width 和 canvas.height 属性。我找不到正确的 JavaScript 语法来使用顶部和左侧设置 Canvas 的偏移量。我尝试过直接在 Canvas 上
我正在尝试为我正在编写的单人纸牌游戏完成条件游戏。 我把所有的 Action 和棋子都移除了。每一 block 都作为椭圆 UI 元素保存在一个二维数组中,当一 block 被拿走时,它会被替换为边框
我正在使用导航 View 修改 Android 应用程序。对于前几个菜单项,我给出了一个图标,但之后,我只给出了菜单标题。但是在导航面板中,没有图标的菜单项有一个空白区域。 如何删除空白区域?我希望菜
我是一名优秀的程序员,十分优秀!