题解 | #牛牛的数组匹配#

牛牛的数组匹配

https://www.nowcoder.com/practice/3d3406f4a7eb4346b025cc592be5b875

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[] A = new int[n];
        int[] B = new int[m];
        for (int i = 0; i < n; i++) {
            A[i] = in.nextInt();
        }
        for (int i = 0; i < m; i++) {
            B[i] = in.nextInt();
        }
        int[] res = m1(A, B);
        for (int val : res) {
            System.out.print(val + " ");
        }
    }

    public static int[] m1(int[] A, int[] B) {
        int m = B.length;
        int sumA = Arrays.stream(A).sum();
        int left = 0;
        int sumB = 0;
        int resLeft = 0;
        int resRight = 0;
        int diff = sumA; // 差值
        for (int i = 0; i < m; i++) {
            sumB += B[i];
            // 窗口内的数据,保证窗口中的和最小,和大了就left右移,和小了就i++
            // left右移:右移到差值比前一个差值小为止
            // sumB > sumA: left++; 直到 diff[left+1] > diff[left], + -
            // sumB < sumA: i++;
            // 包含当前元素:
            while (left < i && sumB > sumA) {
                // sumB > sumA
                // sumB < sumA;
                if (sumB - B[left] <= sumA) {
                    // 不减B[left]:sumB > sumA
                    // left右移:sumB < sumA;
                    if (Math.abs(sumA - sumB) > Math.abs(sumA - sumB - B[left])) {
                        sumB -= B[left];
                        left++;
                    }
                    break;
                } else {
                    sumB -= B[left];
                    left++;
                }
            }
            int curDiff = Math.abs(sumA - sumB);
            if (curDiff < diff) {
                resLeft = left;
                resRight = i;
                diff = curDiff;
            }
        }
        int[] res = new int[resRight - resLeft + 1];
        for (int i = resLeft; i <= resRight; i++) {
            res[i - resLeft] = B[i];
        }
        return res;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 12:04
毕业生招你惹你了,问一个发薪日来一句别看网上乱七八糟的你看哪个工作没有固定发薪日扭头就取消了面试就问了一句公司都是这个态度吗还搞上人身攻击了...
程序员小白条:呃呃呃,都还没面试,我都不会问这么细,何况通不通过,去不去都另说,你没实力和学历的话,在外面就这样,说实话没直接已读不回就不错了,浪费时间基本上
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:31
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务