James
James

Reputation: 461

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.

Upvotes: 1

Views: 1978

Answers (5)

Amitabha Chowdhury
Amitabha Chowdhury

Reputation: 1

I think this is the easiest way to solve this problem.

function getSecondLargest(nums) {
    
    nums = [...new Set(nums)]; // Removing duplicates values
    nums.sort(function (a, b) {return a - b}); // Sorting in ascending order
  return nums[nums.length - 2]; //returning the 2nd largest num
}

console.log(getSecondLargest([1,2,3,3,5,5,6,6,7,7,7,7,8,8,8,8,9,9,9]));

Upvotes: 0

Sakawat Hossain
Sakawat Hossain

Reputation: 1

For those who wants to do this using Math.max(). Here's the simplest way to do this.

const getSecondLargest = function (arr) {
  const largest = Math.max.apply(null, arr);
  for (let i = 0; i < arr.length; i++) {
    if (largest === arr[i]) {
      arr[i] = -Infinity;
    }
  }
  return Math.max.apply(null, arr);
};
console.log(getSecondLargest([3, 5, 9, 9, 9])); //5

Side note: Math.max() don't take an array, so we have to use Math.max.apply() to pass the array in the function. -Infinity is smaller than any negative finite number.

Upvotes: 0

Code Maniac
Code Maniac

Reputation: 37775

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)

Upvotes: 5

idmean
idmean

Reputation: 14915

I’d recommend doing something more like

const nums = [0, 3, 2, 5, 5];
nums.sort(function (a,b) {return b - a;})

for (let i = 1; i < nums.length; i++) {
  if (nums[0] !== nums[i]) {
    return nums[i];
  }
}

which should be a lot more efficient (especially in terms of memory) than converting to a set and back...

Upvotes: 1

user6257773
user6257773

Reputation:

Try this:

var intArray = stringArray.map(nums); // now let's sort and  take the second element :

var second = intArray.sort(function(a,b){return b-a})[1];

};

Upvotes: 0

Related Questions