《LeetCode 力扣》 - 1054. 距离相等的条形码 (哈希+计数+优先队列)

《LeetCode 力扣》 - 1054. 距离相等的条形码 (哈希+计数+优先队列)

方法1 哈希计数+隔位插入

  • 步骤
    • 1、哈希计数
    • 2、讲计数结果进行排序,出现次数多的放前面
    • 3、隔位插入,先出现次数多的,插入到偶数位置,然后再插入奇数位置
  • 复杂度
    • 时间复杂度 O(klogk + n) (k为数的类型个数)
    • 空间复杂度 O(n)
class Solution {

    /**
     * @param Integer[] $barcodes
     * @return Integer[]
     */
    function rearrangeBarcodes($barcodes) {
        $size = count($barcodes);
        if($size <= 2) {
            return $barcodes;
        }
        $map = [];
        $result = array_fill(0, $size, 0);
        foreach($barcodes as $val) {
            $map[$val] = isset($map[$val]) ? ++$map[$val] : 1 ;
        }
        arsort($map);

        $index = 0;
        foreach($map as $item=>$count) {
            for($i = 0; $i < $count; $i++) {
                $result[$index] = $item;
                $index = $index + 2;
                if($index >= $size) {
                    $index = 1;
                }
            }
        }
        return $result;
    }
}

方法2 计数+排序重组+交叉插入

  • 步骤
    • 1、计数
    • 2、将数组重排序,次数少的在前面,例如 [1,1,2] => [2,1,1]
    • 3、将数组从中间分开,然后进行交叉插入
class Solution {

    /**
     * @param Integer[] $barcodes
     * @return Integer[]
     */
    function rearrangeBarcodes($barcodes) {
        $size = count($barcodes);
        if($size <= 2) {
            return $barcodes;
        }

        $map = array_count_values($barcodes);
        usort($barcodes, function($a, $b) use ($map) {
            if($map[$a] == $map[$b]) {
                return $a - $b;
            } else {
                return $map[$a] - $map[$b];
            }
        });

        for($i = 0, $j = intval($size / 2), $k = 0; $i < $size; $i++) {
            if($i % 2 == 0) {
                $result[] = $barcodes[$j++];
            } else {
                $result[] = $barcodes[$k++];
            }
        }
        return $result;
    }
}

方法3 优先队列+依次插入

  • 步骤
    • 1、哈希计数
    • 2、使用优先队列存储
    • 3、遍历优先队列,取次数最多的插入,然后取第二次数多的插入
class Solution {

    /**
     * @param Integer[] $barcodes
     * @return Integer[]
     */
    function rearrangeBarcodes($barcodes) {
        $size = count($barcodes);
        if($size <= 2) {
            return $barcodes;
        }
        $result = [];
        $map = array_count_values($barcodes);
        $pq = new SplPriorityQueue();
        $pq->setExtractFlags(SplPriorityQueue::EXTR_BOTH);
        foreach($map as $item=>$count) {
            $pq->insert($item, $count);
        }

        while(!$pq->isEmpty()) {
            $top = $pq->extract();
            $item = $top['data'];
            $count = $top['priority'];
            if(empty($result) || end($result) != $item) {
                $result[] = $item;
                if($count > 1) {
                    $pq->insert($item, --$count);
                }
            } else {
                $top2 = $pq->extract();
                $item2 = $top2['data'];
                $count2 = $top2['priority'];

                $result[] = $item2;
                $pq->insert($item, $count);

                if($count2 > 1) {
                    $pq->insert($item2, --$count2);
                }
            }
        }
        return $result;
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
明天我们吃什么 悲哀藏在现实中 Tacks
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!