LeetCode - 561. Array Partition I - 数组拆分 I - 贪心和 Hash 思想

发布于 2024-05-22 23:47:02 字数 1976 浏览 17 评论 0

题目

贪心解法

贪心的解法就是对数组进行排序,因为我们要对数组进行划分,每次选取两个,并且选出最小的那个,所以我们不能浪费那些大的数,所以每次不能浪费更大的数,所以选取相邻的数作为一对。

class Solution {

    public int arrayPairSum(int[] nums) {
        Arrays.sort(nums);
        int res = 0;
        for (int i = 0; i < nums.length; i += 2) 
            res += nums[i];
        return res;
    }
}

hash 思想解法

思想也是对数组进行排序,主要是题目中说数的范围在 [-10000,10000] 之间,所以我们可以开一个 20000 大小的数组,足以保存下这些数,然后统计每个元素出现的次数,遍历一遍 hash 数组即可,最多循环 20000 次。

class Solution {

    public int arrayPairSum(int[] nums) {
        int[] hash = new int[20001];
        for (int i = 0; i < nums.length; i++) 
            hash[nums[i] + 10000]++;
        int res = 0;
        boolean odd = true;
        for (int i = 0; i < hash.length; ) {
            if (hash[i] != 0) {    //原数组中存在
                if (odd) {
                    res += (i - 10000);
                    odd = false;
                } else {
                    odd = true;
                }
                if (--hash[i] == 0) i++; //有可能有重复元素
            } else i++;
        }
        return res;
    }
}

更加优化的解法:

class Solution {

    public int arrayPairSum(int[] nums) {
        int[] hash = new int[20001];
        for (int i = 0; i < nums.length; i++) 
            hash[nums[i] + 10000]++;
        int res = 0;
        boolean odd = true;
        for (int i = 0; i < hash.length; i++) {
            while (hash[i] != 0) {
                if (odd) {
                    res += (i - 10000);
                }
                odd = !odd;
                --hash[i];
            }
        }
        return res;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

最初的梦

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文