Search code examples
javascriptarrayswhile-loop

Find 2nd largest value in an array that has duplicates of the largest integer


I'm trying to find the second largest number in an array of numbers, but the greatest number appears twice, so I can't just remove it from the array and select the new highest number.

array = [0, 3, 2, 5, 5] (therefore 3 is the 2nd largest value)

I have this code where I can explicitly return 3, but it wouldn't work on other arrays:

    function getSecondLargest(nums) {

      var sorted_array = nums.sort(function (a,b) {return a - b;});
      var unique_sorted_array = sorted_array.filter(function(elem, index, self) {
    return index === self.indexOf(elem);
})

    return unique_sorted_array[unique_sorted_array.length - 2];
}

return unique_sorted_array[unique_sorted_array.length - 2];

If I wanted to make it more dynamic, is there a way that I could identify the greatest value of the array, then compare that against each iteration of the array?

I was thinking that something along the lines of:

var greatestNum = sortedArray[-1]

while(greatestNum != i) do {
  //check for the first number that doesn't equal greatestNum
}

Any help would be appreciated.


Solution

  • You can simply create a Set first and than sort in descending and take the 1st index element

    let array = [0, 3, 2, 5, 5]
    
    let op = [...new Set(array)].sort((a,b) => b-a)[1]
    
    console.log(op)

    For those who thinks in terms of efficiency. this is the best way IMO

    let array = [0, 3, 2, 5, 5]
    
    let max = -Infinity
    let secondMax = -Infinity
    
    for(let i=0; i<array.length; i++){
      if(array[i] > max){
        secondMax = max
        max = array[i]
      }
    }
    
    console.log(secondMax)