Найдите список в списке списков, сумма элементов которого является самой высокой

Вот мой код, есть ли возможный способ получить максимальную сумму элементов, которую я знаю, это суммировать 2d-массив. но я хочу получить элемент, который имеет наибольшее значение, когда вы суммируете их, проверьте мой код

const sumof2dArray = (arr) => {
    let newArr = []
    for(let i = 0; i < arr.length;i++){
        let sum = 0
        console.info(arr[i])
        for(let j = 0; j < arr[i].length;j++){
   
            sum = sum + arr[i][j] 
            
        }
        newArr.push(sum)
        console.info(sum)
    }
    let max = newArr[0]
    for(let i of newArr){
        if (i > max){
            max = i
        }
    }
    return max
}
sumof2dArray([[1,2,3], [4,5,6], [10,11,12], [7,8,9],[1,3,40]])

мой вывод: 44

но я хочу, чтобы ожидаемый результат элемента был: [1,3,40]

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
61
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Используйте две переменные, одну для хранения наибольшей суммы, а другую для хранения массива с этой суммой. Затем выполните цикл по двумерному массиву, обновляя эти переменные всякий раз, когда сумма строки превышает максимальное значение.

const sumof2dArray = (arr) => {
  let maxRow = arr[0];
  let maxSum = sumOfArray(maxRow);
  
  for (let i = 1; i < arr.length; i++) {
    let newSum = sumOfArray(arr[i]);
    if (newSum > maxSum) {
      maxRow = arr[i];
      maxSum = newSum;
    }
  }
  
  return maxRow;

  function sumOfArray(arr) {
    let sum = 0;
    for (let j = 0; j < arr.length; j++) {
      sum = sum + arr[j]
    }
    return sum;
  }
}

console.info(sumof2dArray([
  [1, 2, 3],
  [4, 5, 6],
  [10, 11, 12],
  [7, 8, 9],
  [1, 3, 40]
]))

44 происходит, когда вы пишете

console.info(sum)

Но вы ничего не делаете с возвращаемым значением функции. Если вы хотите, чтобы он выводил возвращаемое значение, просто замените

sumof2dArray([[1,2,3], [4,5,6], [10,11,12], [7,8,9],[1,3,40]])

с

console.info(sumof2dArray([[1,2,3], [4,5,6], [10,11,12], [7,8,9],[1,3,40]]))

Вы можете обойти все подмассивы. ИСПОЛЬЗУЙТЕ две подпеременные, одну для хранения подмассива с наибольшей суммой, другую для хранения позиции подмассива с наибольшей суммой

const highestSumElement = (arr) => {
    if (!arr || arr.length == 0) {
        return []
    }
    
    let maxSum = 0
    let maxIndex = -1
  
    arr.forEach((item, idx) => {
        let sum = arr[idx].reduce((a, b) => a + b)
        if (sum > maxSum) {
            maxSum = sum
            maxIndex = idx
            
        }
        
    })

    return arr[maxIndex]
}

console.info(highestSumElement([[1,2,3], [4,5,6], [10,11,12], [7,8,9],[1,3,40]]))

Вот еще один метод с использованием Array#reduce.

const sum = arr => arr.reduce((a, b) => a + b, 0);
const sumof2dArray = arr => arr.reduce((acc, curr) => sum(curr) > sum(acc) ? curr : acc);
console.info(sumof2dArray([[1,2,3], [4,5,6], [10,11,12], [7,8,9],[1,3,40]]));

Вот пара ответов, которые вы можете использовать.

Я думаю, что первое более интуитивно понятно, просто отслеживая максимальный массив одновременно с максимальной суммой.

Второй просто использует reduce внутри reduce, чтобы сузить до самого высокого массива.

Может быть полезно инициализировать max в -infinity, если у вас есть отрицательные значения в ваших подмассивах. Например, если бы все они были отрицательными, вы бы никогда не нашли какой-либо суммированный массив с более высоким значением, чем начальный максимум. Это также позволяет вам запускать цикл в начале массива и не обрабатывать первый элемент отдельно.

Каждый из этих примеров должен суммировать каждый подмассив только один раз.

const arr = [
  [1, 2, 3],
  [4, 5, 6],
  [10, 11, 12],
  [7, 8, 9],
  [1, 3, 40],
];

const sumof2dArray = (arr) => {
  let res;
  let max = -Infinity;

  for (a of arr) {
    const sum = a.reduce((a, b) => a + b, 0);
    if (sum > max) {
      max = sum;
      res = a;
    }
  }

  return res;
};

sumof2dArray(arr);

const sumof2dArray2 = (arr) =>
  arr.reduce(
    (prev, curr) => {
      sum = curr.reduce((a, b) => a + b, 0);
      return sum > prev[1] ? [curr, sum] : prev;
    },
    [[], -Infinity]
  )[0];

sumof2dArray2(arr);

Другие вопросы по теме