Given an array of 0 and 1, find minimum no. of swaps to bring all 1s together (only adjacent swaps allowed)

前端 未结 4 623
生来不讨喜
生来不讨喜 2020-12-19 16:52

If given an array of 1\'s and 0\'s, what\'s good algorithm to show the minimum number of adjacent swaps needed to group all of the 1\'s together. The 1\'s don\'t need to be

4条回答
  •  猫巷女王i
    2020-12-19 17:31

    Here is a simple, but not very clever algorithm that will perform an exhaustive search for any input in the range [0, 255].

    • Input:
      • binary string
    • Output:
      • optimal number of steps
      • number of optimal solutions
      • one detailed example

    var transition = [],
        isSolution = [];
    
    function init() {
      var msk = [ 3, 6, 12, 24, 48, 96, 192 ],
          i, j, n, x, cnt, lsb, msb, sz = [];
    
      for(i = 0; i < 0x100; i++) {
        for(n = cnt = msb = 0, lsb = 8; n < 8; n++) {
          if(i & (1 << n)) {
            cnt++;
            lsb = Math.min(lsb, n);
            msb = Math.max(msb, n);
          }
        }
        sz[i] = msb - lsb;
        isSolution[i] = (sz[i] == cnt - 1);
      }
      for(i = 0; i < 0x100; i++) {
        for(j = 0, transition[i] = []; j < 0x100; j++) {
          x = i ^ j;
          if(msk.indexOf(x) != -1 && (x & i) != x && (x & j) != x && sz[j] <= sz[i]) {
            transition[i].push(j);
          }
        }
      }
    }
    
    function solve() {
      var x = parseInt(document.getElementById('bin').value, 2),
          path = [ x ],
          list = [],
          i, min, sol = [], res = [];
    
      recurse(x, path, list);
    
      for(i in list) {
        if(min === undefined || list[i].length <= min) {
          min = list[i].length;
          (sol[min] = (sol[min] || [])).push(list[i]);
        }
      }
      console.log('Optimal length: ' + (min - 1) + ' step(s)');
      console.log('Number of optimal solutions: ' + sol[min].length);
      console.log('Example:');
    
      for(i in sol[min][0]) {
        res.push(('0000000' + sol[min][0][i].toString(2)).substr(-8, 8));
      }
      console.log(res.join(' -> '));
    }
    
    function recurse(x, path, list) {
      if(isSolution[x]) {
        list.push(path);
        return;
      }
      for(i in transition[x]) {
        if(path.indexOf(y = transition[x][i]) == -1) {
          recurse(y, path.slice().concat(y), list);
        }
      }
    }
    
    init();
    
    

提交回复
热议问题