四、距离相等的条形码(Weekly Contest 138)

    xiaoxiao2025-08-04  22

    在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。

    请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。

    示例 1:

    输入:[1,1,1,2,2,2] 输出:[2,1,2,1,2,1] 示例 2:

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

    提示:

    1 <= barcodes.length <= 10000 1 <= barcodes[i] <= 10000

    首先使用优先级队列,将其次数最多的先用掉(防止后面多余出来),后面没隔一个放一个数字,代码如下:

    import java.util.Map; import java.util.Map.Entry; import java.util.PriorityQueue; class Solution { public int[] rearrangeBarcodes(int[] barcodes) { Map<Integer, Integer> map = new HashMap<>(); PriorityQueue<int[]> pri = new PriorityQueue<>( (o1,o2)->{ return o2[1] - o1[1]; } ); for (int is : barcodes) { map.put(is, map.getOrDefault(is, 0) + 1); } for (Entry<Integer, Integer> is : map.entrySet()) { pri.offer(new int[]{is.getKey(),is.getValue()}); } for (int[] is : pri) { System.out.println(Arrays.toString(is)); } int res[] = new int[barcodes.length]; int now[] = pri.poll(); for (int i = 0; i < barcodes.length; i += 2) { if(now[1] <= 0 ){ now = pri.poll(); } now[1]--; res[i] = now[0]; } for (int i = 1; i < barcodes.length; i += 2) { if(now[1] <= 0 ){ now = pri.poll(); } now[1] --; res[i] = now[0]; } return res; } }
    最新回复(0)