hectane logo

Find meeting time slots where all participants are available

Find time slots when all people are free from their calendar

Find meeting time slots where all participants are available

Given time schedules in the form of (startTime - endTime) of n people, print all time intervals where all n participants are available. It's like a meeting application suggesting possible time when we can do a company meeting when all employees are free

This is an interview problem asked in major tech companies like Google, Amazon, AirBnb, Databricks etc.

Below I am giving the brute force solution in javascript how to solve this. Later I will be giving an optimal solution

/**
 * getFreeMeetingTime to find free time slots in a day for a common meeting
 * 
 * @param {array[array]} allPeople An array of arrays of time slots
 */
function getFreeMeetingTime(allPeople) {
  // get a range of time in a day.
  // you can pass the min and max from the input if its not 0 to 24 hrs
  const allTimeSlotsInDay = getAllTimeSlots();
  let tempResult = [];
  
  for (const person of allPeople) {
    for (const time of person) {
      for (
        let i = Number(time.split('-')[0]);
        i < Number(time.split('-')[1]);
        i++
      ) {
        const val = `${i}-${i + 1}`;
        if (!tempResult.includes(val)) {
          tempResult.push(val);
        }
      }
    }
  }
  // merge the times in between. ex '4-5', '5-6' to '4-6'
  return mergeTime(
    allTimeSlotsInDay.filter((time) => !tempResult.includes(time))
  );
}

function mergeTime(timeArray) {
  const result = [];
  let i = 0;
  while (i < timeArray.length) {
    const arr = timeArray[i].split('-');
    let start = Number(arr[0]);
    let end = Number(arr[1]);
    let counter = 0;
    for (let j = i + 1; j < timeArray.length; j++) {
      const jarr = timeArray[j].split('-');
      const jstart = Number(jarr[0]);
      const jend = Number(jarr[1]);

      if (end == jstart || end >= jstart) {
        end = jend;
        counter++;
      }
    }

    i = counter === 0 ? ++i : i + counter + 1;
    result.push(`${start}-${end}`);
  }
  return result;
}

function getAllTimeSlots() {
  const result = [];
  for (let i = 0; i < 24; i = i + 1) {
    result.push(`${i}-${i + 1}`);
  }
  return result;
}

/**
 * Creating a sample data to test
 */

//sample time slots of persons where they are busy
const person_1 = ['4-16', '18-24'];
const person_2 = ['2-14', '17-24'];
const person_3 = ['6-8', '12-20'];
const person_4 = ['10-22'];

// Getting an array of time schedules where people are busy.
const allPeople = [person_1, person_2, person_3, person_4];

// get data back to result
const result = getFreeMeetingTime(allPeople);

console.log(result);