使数组按非递减顺序排列
难度:
标签:
题目描述
代码结果
运行时间: 158 ms, 内存: 30.1 MB
// 思路:通过Stream API的使用来简化操作。我们仍然需要移除所有的下降点,使数组变为非递减。
// 实现方式:使用Stream API和过滤器过滤掉不满足条件的部分。然后计算每次操作的次数。
import java.util.Arrays;
public class Solution {
public int countOperations(int[] nums) {
int operations = 0;
boolean changed = true;
while (changed) {
changed = false;
for (int i = 1; i < nums.length; i++) {
if (nums[i - 1] > nums[i]) {
nums = Arrays.stream(nums)
.filter(n -> n >= nums[i])
.toArray();
changed = true;
operations++;
break;
}
}
}
return operations;
}
}
解释
方法:
该题解采用了单调栈和动态规划的结合方式。首先,初始化一个空栈和一个动态规划数组dp,dp[i]用于记录以nums[i]为起点,数组需要经过的删除步骤数。从数组的末尾开始向前遍历,对于每个元素nums[i],检查栈顶元素representing the indices of elements in the array。如果栈不为空且nums[i]大于栈顶元素对应的数组值,说明nums[i]能在一次操作中保留下来而栈顶元素会被删除,此时将栈顶元素出栈,并更新dp[i]为max(dp[i] + 1, dp[栈顶元素]),意味着nums[i]能延续的删除步骤至少是之前的步骤加一或者栈顶元素的步骤。将每个元素的索引最终压入栈中。最后,返回dp数组中的最大值,即为整个数组变为非递减数组所需的最大删除步骤数。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在算法中使用单调栈而不是其他数据结构,比如数组或链表?
▷🦆
算法中的动态规划数组dp是如何初始化的,为什么所有元素初始值都是0?
▷🦆
在循环中,`while stk and nums[i] > nums[stk[-1]]:` 这个条件是如何确保数组变为非递减的?
▷🦆
为什么每次处理元素时,需要更新`dp[i] = max(dp[i] + 1, dp[stk.pop()])`,这里的逻辑是基于什么考虑?
▷