进行计算中毒状态
class Solution {
public int findPoisonedDuration(int[] timeSeries, int duration) {
// //合并区间 区间合并 进行操作
// //找出所有的数据 利用非递减
// if (timeSeries.length == 0) {
// return 0;
// }
// int sum = 0;
// int[] result = new int[2];
// for (int i = 0; i < timeSeries.length; i++) {
// if (i == 0) {
// result[0] = timeSeries[i];
// result[1] = timeSeries[i] + duration;
// } else {
// if (result[1] >= timeSeries[i]) {
// result[1] = timeSeries[i] + duration;
// } else {
// sum += result[1] - result[0];
// result[0] = timeSeries[i];
// result[1] = timeSeries[i] + duration;
// }
// }
// }
// return sum + result[1] - result[0];
int ans = 0;
int expired = 0;
for (int i = 0; i < timeSeries.length; i++) {
if (timeSeries[i] >= expired){
ans += duration;
}else {
ans += timeSeries[i] + duration -expired;
}
expired = timeSeries[i] + duration;
}
return ans;
}
}
第一个思路:自己直接写的 -因为可能之前做了合并数组的,所以想到了这个 时间复杂度是O(n)空间复杂度是O(3)
第二个思路是参考讲解,时间复杂度是O(n)空间复杂度是O(1)
总结:对于数组进行合并问题,
1. 无序一般上来先进行排序
2.然后通过有序来进行 第一个集合的末尾数字和第二个集合的第一个数字是否有交集,如果有则进行合并,如果没有则分为两个(如果是求所有的长度,这是可借助第一个思想,第一个思想可以解加duration和静态数组);
详细demo:
1. [[1,3],[2,5],[7,9]] 静态数组,求覆盖长度 第一个思想应该是
[1,3] [2,5] -> [1,5]
[1,5] ->不满足(算出sum += 5-1;)直接更新 [7,9] 最后:sum += sum+(9-7)
2. [1,5,8] 静态数组 添加duration 实际操作还是类似的操作 [[1,1+duration],[5,5+duration],[8,8+duration]] 经过操作 就回到了上面的第一种思路情况
总结:对于面积长度出现 数组或者区域重复覆盖问题操作,都是考察数组合并问题,通常时间复杂度都为O(n) 只是空间复杂度需要进行细节考虑
坚持思维改变,加油!!