Welcome to Subscribe On Youtube

1054. Distant Barcodes

Description

In a warehouse, there is a row of barcodes, where the ith barcode is barcodes[i].

Rearrange the barcodes so that no two adjacent barcodes are equal. You may return any answer, and it is guaranteed an answer exists.

 

Example 1:

Input: barcodes = [1,1,1,2,2,2]
Output: [2,1,2,1,2,1]

Example 2:

Input: barcodes = [1,1,1,1,2,2,3,3]
Output: [1,3,1,3,1,2,1,2]

 

Constraints:

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

Solutions

  • class Solution {
        public int[] rearrangeBarcodes(int[] barcodes) {
            int n = barcodes.length;
            Integer[] t = new Integer[n];
            int mx = 0;
            for (int i = 0; i < n; ++i) {
                t[i] = barcodes[i];
                mx = Math.max(mx, barcodes[i]);
            }
            int[] cnt = new int[mx + 1];
            for (int x : barcodes) {
                ++cnt[x];
            }
            Arrays.sort(t, (a, b) -> cnt[a] == cnt[b] ? a - b : cnt[b] - cnt[a]);
            int[] ans = new int[n];
            for (int k = 0, j = 0; k < 2; ++k) {
                for (int i = k; i < n; i += 2) {
                    ans[i] = t[j++];
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        vector<int> rearrangeBarcodes(vector<int>& barcodes) {
            int mx = *max_element(barcodes.begin(), barcodes.end());
            int cnt[mx + 1];
            memset(cnt, 0, sizeof(cnt));
            for (int x : barcodes) {
                ++cnt[x];
            }
            sort(barcodes.begin(), barcodes.end(), [&](int a, int b) {
                return cnt[a] > cnt[b] || (cnt[a] == cnt[b] && a < b);
            });
            int n = barcodes.size();
            vector<int> ans(n);
            for (int k = 0, j = 0; k < 2; ++k) {
                for (int i = k; i < n; i += 2) {
                    ans[i] = barcodes[j++];
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
            cnt = Counter(barcodes)
            barcodes.sort(key=lambda x: (-cnt[x], x))
            n = len(barcodes)
            ans = [0] * len(barcodes)
            ans[::2] = barcodes[: (n + 1) // 2]
            ans[1::2] = barcodes[(n + 1) // 2 :]
            return ans
    
    
  • func rearrangeBarcodes(barcodes []int) []int {
    	mx := slices.Max(barcodes)
    	cnt := make([]int, mx+1)
    	for _, x := range barcodes {
    		cnt[x]++
    	}
    	sort.Slice(barcodes, func(i, j int) bool {
    		a, b := barcodes[i], barcodes[j]
    		if cnt[a] == cnt[b] {
    			return a < b
    		}
    		return cnt[a] > cnt[b]
    	})
    	n := len(barcodes)
    	ans := make([]int, n)
    	for k, j := 0, 0; k < 2; k++ {
    		for i := k; i < n; i, j = i+2, j+1 {
    			ans[i] = barcodes[j]
    		}
    	}
    	return ans
    }
    
  • function rearrangeBarcodes(barcodes: number[]): number[] {
        const mx = Math.max(...barcodes);
        const cnt = Array(mx + 1).fill(0);
        for (const x of barcodes) {
            ++cnt[x];
        }
        barcodes.sort((a, b) => (cnt[a] === cnt[b] ? a - b : cnt[b] - cnt[a]));
        const n = barcodes.length;
        const ans = Array(n);
        for (let k = 0, j = 0; k < 2; ++k) {
            for (let i = k; i < n; i += 2, ++j) {
                ans[i] = barcodes[j];
            }
        }
        return ans;
    }
    
    

All Problems

All Solutions