描述
有一家生产牛奶的工厂,每天生产不同批次的牛奶。每批牛奶有一定的生产时间,用分钟表示。将这些批次的牛奶装进容量有限的罐子里,罐子的容量是根据装牛奶的时间来计算的。
现在给你两个非递减顺序排列的整数数组 times1 和 times2,分别表示牛奶工厂每天生产的两个车间每批次牛奶的生产时间。另外两个整数 m 和 n ,分别表示 times1 和 times2 中的元素数目。
请你将 times2 中的批次 牛奶的生产时间合并到 times1 中,使合并后的数组仍然按非递减顺序排列。并计算合并后的数组中生产时间之和。
示例1
输入:[10,20,30,0,0,0],[20,40,60],3,3
返回值:180
备注:
注意:time1的数组长度始终保持为m+n,初始后n个元素为0
times1.length == m + n
times2.length == n
0 <= m, n <= 100
1 <= m + n <= 200
-109 <= times1[i], times2[j] <= 100
知识点
双指针
解题思路
然后,我们使用两个指针 i 和 j,分别指向数组 time1 和 time2 的起始位置。同时,我们使用一个变量 ans来记录生产时间之和,并初始化为0。
接下来,我们开始合并 time2 到 time1。我们将 time1[i] 和 time2[j] 中较小的一个加入到合并后的数组中,并将较小的数对应的指针向后移动一位。同时,我们将对应的生产时间加到 ans中。
如果其中一个指针已经到达了数组末尾,我们将另一个数组剩余的部分依次加入到合并后的数组中,并将对应的生产时间加到 ans中。
最后,当两个指针都到达了各自数组的末尾时,我们得到了合并后的数组 time1,并且 ans就是合并后的生产时间之和。
Java题解
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param time1 int整型一维数组
* @param time2 int整型一维数组
* @param m int整型
* @param n int整型
* @return int整型
*/
public int milk_sum (int[] time1, int[] time2, int m, int n) {
// write code here
int[] mergedTimes = new int[m + n]; // 合并后的数组
int i = 0;
int j = 0;
int ans = 0;
int k = 0;
while (i < m && j < n) {
if (time1[i] <= time2[j]) {
mergedTimes[k] = time1[i];
ans += time1[i];
i++;
} else {
mergedTimes[k] = time2[j];
ans += time2[j];
j++;
}
k++;
}
while (i < m) {
mergedTimes[k] = time1[i];
ans += time1[i];
i++;
k++;
}
while (j < n) {
mergedTimes[k] = time2[j];
ans += time2[j];
j++;
k++;
}
// 将合并后的数组赋值给 times1
System.arraycopy(mergedTimes, 0, time1, 0, m + n);
return ans;
}
}