LeetCode刷题 --- 两个关联数组的排序技巧

刷题的过程中,经常会遇到一些题目中给了关联数组,即 int[] values1 ,int[] values2,解题过程中需要根据某个数组的值进行排序,但是要同时保证另外一个关联数组也按照同样规则排序。

原来的做法:

构造二元数组,然后排序,后续取值的时候,从二元数组中取值。

如下:根据values的进行从大到小排序

    public static void main(String[] args) {
        int[] values = new int[] {5, 6, 3, 2, 1};
        int[] labels = new int[] {1, 1, 2, 2, 3};

        int[][] sss = new int[values.length][2];
        for (int i = 0; i < sss.length; i++) {
            sss[i][0] = values[i];
            sss[i][1] = labels[i];
        }
        // Arrays.sort(sss, new Comparator<int[]>() {
        //     @Override
        //     public int compare(int[] o1, int[] o2) {
        //         return o2[0] - o1[0];
        //     }
        // });

        Arrays.sort(sss, (a, b) -> b[0] - a[0]);

        for (int i = 0; i < sss.length; i++) {
            System.out.print(sss[i][0]);
        }
    }

小技巧:

构建一个一维数组,存储数组的坐标,然后根据排序规则新数组,取值根据坐标取就OK了

如下:根据values的进行从大到小排序

    public static void main(String[] args) {
        int[] values = new int[] {5, 6, 3, 2, 1};
        int[] labels = new int[] {1, 1, 2, 2, 3};

        Integer[] id = new Integer[values.length];
        for (int i = 0; i < id.length; i++) {
            id[i] = i;
        }
        Arrays.sort(id, (a, b) -> values[b] - values[a]);

        for (int i = 0; i < id.length; i++) {
            System.out.print(values[id[i]]);
        }
    }

1090. 受标签影响的最大值

解题思路:

给定的两个数组按照value值进行关联排序,后面按照题意解题即可。

排序+哈希

class Solution {
    public int largestValsFromLabels(int[] values, int[] labels, int numWanted, int useLimit) {
        Integer[] id = new Integer[values.length];
        for (int i = 0; i < id.length; i++) {
            id[i] = i;
        }
        Arrays.sort(id, (a, b) -> values[b] - values[a]);

        int selectCount = 0;
        int sum = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < id.length; i++) {
            int value = values[id[i]];
            int label = labels[id[i]];
            if (selectCount >= numWanted) {
                break;
            }
            if (!map.containsKey(label)) {
                map.put(label, 1);
                sum += value;
                selectCount++;
            } else if (map.get(label) < useLimit) {
                map.put(label, map.get(label) + 1);
                sum += value;
                selectCount++;
            } else {
                continue;
            }
        }
        return sum;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值