最小缩进次数

1

题目分析

  本题看你能否想到合适的算法进行求解,可以考虑使用分治算法,但是时间复杂度为$O(n^2)$,因此无法在指定的时间范围内求解,所以要考虑$O(n)$或者$O(nlog(n))$的算法。而$O(nlog(n))$的算法往往和二分有关,因此很难求解。在$O(n)$的算法中,常用模拟遍历,动态规划,栈的思路求解,小伙伴们能否根据提示,想出合适的算法呢?

模拟

我们发现在缩进的过程中。如果当前行的缩进大于上一行,那么在调整上一行的时候,连着本行一起调整是最优的,本次只需要调整两行之间的差值即可。如果当前行的缩进小于等于上一行,那么在调整上一行的时候,已经将本行的缩进调整为0了,则跳过本行的调整即可。

说完了思路,代码就非常好理解了,直接看代码吧。

算法的**时间复杂度为$O(n)$,空间复杂度为$O(1)$**。

1
2
3
4
5
6
7
8
9
10
11
public class Solution {
public int calc(int[] nums) {
int res = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
res += nums[i] - nums[i - 1];
}
}
return res;
}
}

刷题总结

  看了这么简洁的代码,是否有些无语呢?有时候多想一想,可能就会灵光乍现。

-------------本文结束感谢您的阅读-------------
0%