我正在尝试编写一个程序,其输入是一个整数数组和它的大小。这个代码必须删除比左侧元素小的元素。我们想要找出重复此操作的次数,以便不能再删除任何元素。以下是我的代码,它可以工作,但我希望它更快。
你有什么办法可以让这段代码更快,或者有一种更快的方法吗?
例如,给定数组[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]。
你有什么办法可以让这段代码更快,或者有一种更快的方法吗?
例如,给定数组[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;
}
}
10,5,3
和8,7,1
,上升斜率是3,4,6,8
。下降斜率在单次遍历中被移除。每次遍历将删除一个元素的上升斜率。因此,这个例子有 4 个计数,因为最长的上升斜率有四个元素,而峰值 8 小于峰值 10。 - user3386109i=4
,我们得到j=0
,且i-j = 4.
- Stefj < i
,如果array[j] < array[i]
,则distance[i] = max(distance[j]) + 1
。如果不存在这样的j
,则distance[i] = 0
。幸运的是,这个问题也可以在线性时间内解决,这符合10^5约束的大小。 - wLui155array[i]
所需的轮数为1.0
(未删除array[i]
)2.1
(其相邻元素array[i-1]>array[i]
)或3.查找左侧最接近array[i]
的较大元素array[k]
。然后,删除的次数是在索引k
和i
之间删除某些中间元素所需的最大轮数加一。如描述的那样,该问题似乎需要O(N ^ 2)时间才能解决,但通过一些巧妙的操作,可以更快地完成。 - wLui155