JSFiddle - React, Tailwind, and code Playground

by Pavel Kityan

JavaScript

var a = [
  [1, 3.33],
  [2, 3.5],
  [4.1, 7],
  [2, 5],
  [10, 15]
];

var sets = createSets(a);
var max = getMax(sets);
console.log('Max length =', max.length, 'and line is', sets[max.index]);

/// 

function createSets(lines) {
  var sets = []

  for (var j = 0, qty = lines.length; j < qty; j++) {
    var line = lines[j];
    if (!sets.length) {
      sets.push(line);
      continue;
    }

    var cntr = 0;
    var indexesToCombine = [];
    for (var i = 0, qty2 = sets.length; i < qty2; i++) {
      if (check(sets[i], line)) {
        cntr++;
        combineSetWithLine(sets, i, line);
        indexesToCombine.push(i);
      }
    }
    if (cntr == sets.length) {
      sets = combineSets(sets, indexesToCombine);
    } else {
      sets.push(line);
    }

  }

  return sets;
}


function check(where, what) {
  return (
    (what[0] >= where[0] && what[0] <= where[1]) || // левая точка внутри 
    (what[1] >= where[0] && what[1] <= where[1]) || // права точка внутри
    (what[0] < where[0] && what[1] > where[1]) // точки по разные стороны
  )
}

function combineSetWithLine(sets, i, line) {
  sets[i][0] = (sets[i][0] > line[0]) ? line[0] : sets[i][0];
  sets[i][1] = (sets[i][1] < line[1]) ? line[1] : sets[i][1];
}

function combineSets(_sets, indexesToCombine) {
  if (_sets.length == 1) {
    return _sets;
  }
  var sets = [];
  var combined = [];
  for (var i = 0, qty = _sets.length; i < qty; i++) {
    if (indexesToCombine.indexOf(i) < 0) {
      sets.push(_sets[i]);
    } else {
      combined[0] = (combined[0] === undefined || combined[0] > _sets[i][0]) ? _sets[i][0] : combined[0];
      combined[1] = (combined[1] === undefined || combined[1] < _sets[i][1]) ? _sets[i][1] : combined[1];
    }
  }
  sets.push(combined);
  return sets;
}


function getMax(sets) {
  var lengthes = sets.map(function(el) {
    return el[1] - el[0];
  })
  var max = {
    length: lengthes[0],
    index: 0
  }
  if (lengthes.length == 1) {
    return max;
  }
  for (var j = 1; j <...