Вот мой код, есть ли возможный способ получить максимальную сумму элементов, которую я знаю, это суммировать 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]
Используйте две переменные, одну для хранения наибольшей суммы, а другую для хранения массива с этой суммой. Затем выполните цикл по двумерному массиву, обновляя эти переменные всякий раз, когда сумма строки превышает максимальное значение.
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);