• Java实现 LeetCode 561 数组拆分 I(通过排序算法改写PS:难搞)


    561. 数组拆分 I

    给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。

    示例 1:

    输入: [1,4,3,2]

    输出: 4
    解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).
    提示:

    n 是正整数,范围在 [1, 10000].
    数组中的元素范围在 [-10000, 10000].
    PS:

    小编最近有点头晕,看来刷不了什么算法题了

    class Solution {
         public int arrayPairSum(int[] nums) {
            boolean[] flag = new boolean[20001];
            int sum = 0;
            for (int v: nums) {
                flag[v + 10000] = !flag[v + 10000];
                sum += v;
            }
    
            int loss = 0;
            boolean searchFirst = true;
            int first = 0;
            for (int i = 0; i <= 20000; i++) {
                if (flag[i]) {
                    if (searchFirst)
                        first = i;
                    else
                        loss += i - first;
                    
                    searchFirst = !searchFirst;
                }
            }
            return (sum - loss) / 2;
    
        }
    }
    
  • 相关阅读:
    是否是轮回(续)
    夜雨做成秋
    53分
    浮生六记 一成长星和月
    企业信息化常见缩略语汇总
    是否是轮回
    对信号集操作函数的使用方法和顺序
    fcntl.h
    关于linux信号量的基本使用
    linux 共享内存
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075436.html
Copyright © 2020-2023  润新知