移除所有载有违禁货物车厢所需的最少时间
难度:
标签:
题目描述
代码结果
运行时间: 716 ms, 内存: 17.1 MB
/*
* 思路:
* 1. 使用Stream处理字符串,计算从左端、右端和中间移除违禁车厢的最小时间。
*/
import java.util.stream.IntStream;
public class RemoveIllegalGoodsStream {
public static int minimumTime(String s) {
int n = s.length();
int leftRemoval = (int) IntStream.range(0, n)
.filter(i -> s.charAt(i) == '1')
.map(i -> i)
.average()
.orElse(0) * 2;
int rightRemoval = (int) IntStream.range(0, n)
.filter(i -> s.charAt(n - 1 - i) == '1')
.map(i -> i)
.average()
.orElse(0) * 2;
int middleRemoval = (int) IntStream.range(0, n)
.filter(i -> s.charAt(i) == '1')
.count() * 2;
return Math.min(leftRemoval, Math.min(rightRemoval, middleRemoval));
}
public static void main(String[] args) {
System.out.println(minimumTime("1100101")); // 输出:5
System.out.println(minimumTime("0010")); // 输出:2
}
}
解释
方法:
此题解采用一种贪心策略,结合动态规划的思想,来找出移除所有违禁货物车厢所需的最少时间。算法思路包括计算两个主要值:
1. `re`:在处理到当前字符时,如果选择从左端或右端开始移除,到目前为止所需的最少时间。
2. `curmin`:在处理到当前字符时,如果选择从任意位置移除违禁货物车厢,到目前为止所需的最少时间。
对于每个字符,如果是'0'(不含违禁货物),则直接继续;如果是'1'(含违禁货物),则计算两种策略的最小值:即从左端开始移除到当前位置,或者从当前位置向右移除。同时更新`curmin`为直接移除当前位置的车厢或保持之前的最小值(即在此之前的任何位置移除车厢)。最终,返回所有字符处理完毕后的最小值。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
算法中的`curmin`变量是如何在不同迭代中更新的,能详细解释其逻辑和作用吗?
▷🦆
在代码中,`re = min(re, curmin + len(s) - i)`这一步的逻辑是基于什么考虑?这里的`len(s) - i`代表什么?
▷🦆
题解提到了使用贪心策略结合动态规划,具体的贪心策略是如何体现在算法中的?
▷