Как получить элементы с максимальной разницей в одном массиве? - PullRequest
2 голосов
/ 11 июня 2019

Предположим, a = [3,7, 8,66,121,223,228], как получить элементы с максимальной разницей между ними?У меня есть это решение, но я буду признателен за лучший код, чем этот.

let arr = []
a.sort((a,b)=>{
    return arr.push(a-b)
})
let index = arr.indexOf(Math.max(...arr))
a.sort((a,b)=> a-b).slice(index,index+2) 

Я ожидаю, что результат будет [121,223]

Ответы [ 5 ]

2 голосов
/ 11 июня 2019

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

var array = [3, 7, 8, 66, 121, 223, 228],
    result = array.reduce((r, b, i, { [i - 1]: a }) => {
        if (i === 0) return;
        if (i === 1 || b - a > r[1] - r[0]) return [a, b];
        return r;
    }, undefined);

console.log(result);
0 голосов
/ 11 июня 2019

Вы можете решить эту проблему кратко с помощью Array.reduce :

let maxDiff = arr => arr.reduce((acc, c, i, arr) => {	
  if(i && c - arr[i-1] > arr[i-1] - arr[i-2])
    acc = [arr[i-1], c]
  return acc
}, [])

console.log(maxDiff([3,7,8,66,121,223,228]))      // <-- [121,223]
console.log(maxDiff([3,7,8,66,121,223,228,1000])) // <-- [228,1000]

Идея состоит в том, чтобы начать с первого элемента (i == 1) и оттуда сравнить разницу между последней парой arr[i-1] - arr[i-2] и текущей парой(c - arr[i-1]).Если разница больше, перезапишите аккумулятор, пока не дойдете до конца.

На самом деле вы можете набрать одну строку:

let maxDiff = arr => arr.reduce((r,c,i,a) => 
  (r = i && c - a[i-1] > a[i-1] - (a[i-2] || 0) ? [a[i-1], c] : r, r), [])

console.log(maxDiff([3,7,8,66,121,223,228]))      // <-- [121,223]
console.log(maxDiff([3,7,8,66,121,223,228,1000])) // <-- [228,1000]
0 голосов
/ 11 июня 2019
a= [3,7, 8,66,121,223,228]
let MaxIntervalPosition = 0

for(let i=0;i<a.length-2;i++){
    if(Math.abs(a[i]-a[i+1]) > MaxIntervalPosition) {
        MaxIntervalPosition = i
    }
    return [a[i],a[i+1]]
}
0 голосов
/ 11 июня 2019

Код, приведенный ниже, возвращает 3 элемента

0 - найдена максимальная разница

1 - элемент 1 пары.

2 - элемент 2 пары.

Использование оператора reduce для итерации и поиска пары довольно просто.Я не проверял это с рандомизированным массивом.

const array = [3,7, 8,66,121,223,228];

const maxDiff = (arr) => arr.reduce((a, v, i) =>
                              {
                                if(i === arr.length-1) return a;
                                const diff = Math.abs(v-arr[i+1]);
                                return (diff > a[0]) ? [diff, v, arr[i+1]] : a;
                              }, [0]);



console.log(maxDiff(array));

// use a simple destructure to seperate diff and elements
const  [diff, ...elements] = maxDiff(array);
console.log(elements);
0 голосов
/ 11 июня 2019

Вы можете сделать это

 var a = [3,7, 8,66,121,223,228]
 var difference = 0;
 var pairIndex = 0;

 for(i = 0; i < a.length; i++) {
  var currentItem = a[i];
  var nextItem = a[i+1];
  var currentDifference = Math.abs(currentItem - nextItem);

  if(currentDifference > difference) {
    difference = currentDifference;
    pairIndex = i;
  }
 }

var pair = [a[pairIndex], a[pairIndex + 1]];
return pair;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...