题解 | #牛奶工厂#

110 阅读2分钟

描述

有一家生产牛奶的工厂,每天生产不同批次的牛奶。每批牛奶有一定的生产时间,用分钟表示。将这些批次的牛奶装进容量有限的罐子里,罐子的容量是根据装牛奶的时间来计算的。

现在给你两个非递减顺序排列的整数数组 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;
    }
}