How to write the code with less time complexity for finding the missing element in given array range?

后端 未结 6 1999
一向
一向 2021-02-02 18:34

My function should return the missing element in a given array range. So i first sorted the array and checked if the difference between i and i+1 is not equal to 1, i\'m returni

6条回答
  •  臣服心动
    2021-02-02 18:56

    Well, from the question (as it's supposed to return a single number) and all the existing solution (examples at least), it looks like list is unique. For that case I think we can sumthe entire array and then subtracting with the expected sum between those numbers will generate the output.

    sum of the N natural numbers

    1 + 2 + ....... + i + ... + n we can evaluate by n * (n+1) / 2

    now assume, in our array min is i and max is n

    so to evaluate i + (i+1) + ..... + n we can

    A = 1 + 2 + ..... + (i-1) + i + (i+1) + .... n (i.e. n*(n+1)/2)

    B = 1 + 2 + ..... + (i-1) and

    C = A - B will give us the sum of (i + (i+1) + ... + n)

    Now, we can iterate the array once and evaluate the actual sum (assume D), and C - D will give us the missing number.

    Let's create the same with each step at first (not optimal for performance, but more readable) then we will try to do in a single iteration

    let input1 = [2, 3, 1, 5],
        input2 = [2, 3, 1, 5, 4, 6, 7, 9, 10],
        input3 = [3, 4, 5, 6, 8];
    
    let sumNatural = n => n * (n + 1) / 2;
    
    function findMissing(array) {
      let min = Math.min(...array),
          max = Math.max(...array),
          sum = array.reduce((a,b) => a+b),
          expectedSum = sumNatural(max) - sumNatural(min - 1);
          return expectedSum - sum;
    }
    
    console.log('Missing in Input1: ', findMissing(input1));
    console.log('Missing in Input2: ', findMissing(input2));
    console.log('Missing in Input3: ', findMissing(input3));

    Now, lets try doing all in a single iteration (as we were iterating 3 times for max, min and sum)

    let input1 = [2, 3, 1, 5],
        input2 = [2, 3, 1, 5, 4, 6, 7, 9, 10],
        input3 = [3, 4, 5, 6, 8];
    
    let sumNatural = n => n * (n + 1) / 2;
    
    function findMissing(array) {
      let min = array[0],
          max = min,
          sum = min,
          expectedSum;
      // assuming the array length will be minimum 2
      // in order to have a missing number
      for(let idx = 1;idx < array.length; idx++) {
        let each = array[idx];
        min = Math.min(each, min); // or each < min ? each : min;
        max = Math.max(each, max); // or each > max ? each : max;
        sum+=each; 
      }
    
      expectedSum = sumNatural(max) - sumNatural(min - 1);
      return expectedSum - sum;
    }
    
    console.log('Missing in Input1: ', findMissing(input1));
    console.log('Missing in Input2: ', findMissing(input2));
    console.log('Missing in Input3: ', findMissing(input3));

提交回复
热议问题