ottenere il numero più vicino dall'array


163

Ho un numero da meno 1000 a più 1000 e ho un array con numeri. Come questo:

[2, 42, 82, 122, 162, 202, 242, 282, 322, 362]

Voglio che il numero che ho sia cambiato con il numero più vicino dell'array.

Ad esempio, ricevo 80il numero che desidero ottenere 82.


2
Incredibilmente semplice: metti da parte una variabile x, attraversa l'array uno per uno, confronta icon il numero corrente nell'array, se la differenza tra esso ed iè inferiore al valore corrente in x, impostato xsul numero di array corrente. Al termine, xha il numero più vicino iall'array.
ingannare

Risposte:


208

Versione ES5:

var counts = [4, 9, 15, 6, 2],
  goal = 5;

var closest = counts.reduce(function(prev, curr) {
  return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
});

console.log(closest);


1
il rovescio della medaglia è che funziona solo se il callback di reduce viene chiamato dallo stesso ambito dei var dichiarati. Dal momento che non è possibile passare goalper ridurre, è necessario fare riferimento a un ambito globale.
7yl4r,

5
potrebbe usare anche una funzione di ordine superiore per farlo.
dmp,

3
@ 7yl4r o avvolgerlo in una funzione? ;)
Dominic,

1
@ 7yl4r non proprio ... puoi usare bind per raggiungere questo ... ---------- // riduttore di funzione goal) <Math.abs (prev - goal)? curr: prev); } // main.js var count = [4, 9, 15, 6, 2], goal = 5; unts.reduce (riduzioneer.bind (null, obiettivo)); ---------- Non so come inserire il codice nei commenti hahaha.
Mauricio Soares,

Questo scorre su ogni elemento che non è ottimale se l'elenco è ordinato ma va bene per elenchi di piccole dimensioni. Anche senza una ricerca binaria un loop potrebbe uscire se il numero successivo è un altro modo.
Dominic

144

Ecco lo pseudo-codice che dovrebbe essere convertibile in qualsiasi linguaggio procedurale:

array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]
number = 112
print closest (number, array)

def closest (num, arr):
    curr = arr[0]
    foreach val in arr:
        if abs (num - val) < abs (num - curr):
            curr = val
    return curr

Risolve semplicemente le differenze assolute tra il numero dato e ciascun elemento dell'array e ti restituisce uno di quelli con la differenza minima.

Per i valori di esempio:

number = 112  112  112  112  112  112  112  112  112  112
array  =   2   42   82  122  162  202  242  282  322  362
diff   = 110   70   30   10   50   90  130  170  210  250
                         |
                         +-- one with minimal absolute difference.

Come prova del concetto, ecco il codice Python che ho usato per mostrarlo in azione:

def closest (num, arr):
    curr = arr[0]
    for index in range (len (arr)):
        if abs (num - arr[index]) < abs (num - curr):
            curr = arr[index]
    return curr

array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]
number = 112
print closest (number, array)

E, se ne hai davvero bisogno in Javascript, vedi sotto per un file HTML completo che dimostra la funzione in azione:

<html>
    <head></head>
    <body>
        <script language="javascript">
            function closest (num, arr) {
                var curr = arr[0];
                var diff = Math.abs (num - curr);
                for (var val = 0; val < arr.length; val++) {
                    var newdiff = Math.abs (num - arr[val]);
                    if (newdiff < diff) {
                        diff = newdiff;
                        curr = arr[val];
                    }
                }
                return curr;
            }
            array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
            number = 112;
            alert (closest (number, array));
        </script>
    </body>
</html>

Ora tieni presente che potrebbe esserci spazio per una maggiore efficienza se, ad esempio, i tuoi elementi di dati sono ordinati (che potrebbe essere dedotto dai dati di esempio ma non lo dichiari esplicitamente). Ad esempio, è possibile utilizzare una ricerca binaria per trovare l'elemento più vicino.

Dovresti anche tenere presente che, a meno che non sia necessario farlo più volte al secondo, i miglioramenti dell'efficienza saranno quasi impercettibili a meno che i tuoi set di dati non diventino molto più grandi.

Se non volete provare in questo modo (e in grado di garantire l'array è ordinato in ordine crescente), questo è un buon punto di partenza:

<html>
    <head></head>
    <body>
        <script language="javascript">
            function closest (num, arr) {
                var mid;
                var lo = 0;
                var hi = arr.length - 1;
                while (hi - lo > 1) {
                    mid = Math.floor ((lo + hi) / 2);
                    if (arr[mid] < num) {
                        lo = mid;
                    } else {
                        hi = mid;
                    }
                }
                if (num - arr[lo] <= arr[hi] - num) {
                    return arr[lo];
                }
                return arr[hi];
            }
            array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
            number = 112;
            alert (closest (number, array));
        </script>
    </body>
</html>

In pratica utilizza il bracketing e il controllo del valore medio per ridurre della metà lo spazio della soluzione per ogni iterazione, un O(log N)algoritmo classico mentre la ricerca sequenziale sopra era O(N):

0  1  2   3   4   5   6   7   8   9  <- indexes
2 42 82 122 162 202 242 282 322 362  <- values
L             M                   H  L=0, H=9, M=4, 162 higher, H<-M
L     M       H                      L=0, H=4, M=2, 82 lower/equal, L<-M
      L   M   H                      L=2, H=4, M=3, 122 higher, H<-M
      L   H                          L=2, H=3, difference of 1 so exit
          ^
          |
          H (122-112=10) is closer than L (112-82=30) so choose H

Come detto, ciò non dovrebbe fare molta differenza per piccoli set di dati o per cose che non devono essere accecanti, ma è un'opzione che potresti prendere in considerazione.


2
@micha, ho aggiunto l'eqivalente codice JS alla risposta, mi è bastato un po 'di tempo per cambiare la lingua da una a cui ero più abituato :-)
paxdiablo,

2
Runtime scadente per questo algoritmo se si dispone di set di dati di grandi dimensioni.
ylun.ca,

4
@ ylun.ca, dal momento che non c'è alcuna dichiarazione esplicita nella domanda che i dati sono ordinati (l'esempio è ordinato ma che potrebbe essere una coincidenza), non puoi ottenere una migliore efficienza di O (n). In ogni caso, per un set di dati di quelle dimensioni, l'efficienza è per lo più irrilevante. Ma il tuo punto è valido, quindi aggiungerò delle note in tal senso per rendere la risposta più completa.
paxdiablo,

1
Grazie, vorrei poter votare più di una volta! Altre risposte sullo overflow dello stack dovrebbero comportare questo tipo di sforzo.
Richard Vanbergen,

48

Versione ES6 (2015):

const counts = [4, 9, 15, 6, 2];
const goal = 5;

const output = counts.reduce((prev, curr) => Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);

console.log(output);

Per la riusabilità è possibile includere una funzione curry che supporta segnaposto ( http://ramdajs.com/0.19.1/docs/#curry o https://lodash.com/docs#curry ). Ciò offre molta flessibilità a seconda delle necessità:

const getClosest = curry((counts, goal) => {
  return counts
    .reduce((prev, curr) => Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
});

const closestTo5 = getClosest(_, 5);
const closestTo = getClosest([4, 9, 15, 6, 2]);

24

Codice di lavoro come di seguito:

var array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

function closest(array, num) {
  var i = 0;
  var minDiff = 1000;
  var ans;
  for (i in array) {
    var m = Math.abs(num - array[i]);
    if (m < minDiff) {
      minDiff = m;
      ans = array[i];
    }
  }
  return ans;
}
console.log(closest(array, 88));


8
Più siamo, meglio è.
Hot Licks,

6
Direi che questa è una soluzione migliore perché utilizza solo JavaScript. La risposta accettata utilizza jQuery, che non è stato menzionato nella domanda originale, e che altri che stanno esaminando questa domanda potrebbero non utilizzare.
Sean the Bean,

17

Funziona con array non ordinati

Mentre c'erano alcune buone soluzioni pubblicate qui, JavaScript è un linguaggio flessibile che ci offre strumenti per risolvere un problema in molti modi diversi. Dipende tutto dal tuo stile, ovviamente. Se il tuo codice è più funzionale, troverai la variazione di riduzione adatta, ovvero:

  arr.reduce(function (prev, curr) {
    return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
  });

Tuttavia, alcuni potrebbero trovarlo difficile da leggere, a seconda del loro stile di codifica. Pertanto propongo un nuovo modo di risolvere il problema:

  var findClosest = function (x, arr) {
    var indexArr = arr.map(function(k) { return Math.abs(k - x) })
    var min = Math.min.apply(Math, indexArr)
    return arr[indexArr.indexOf(min)]
  }

  findClosest(80, [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]) // Outputs 82

Contrariamente ad altri approcci che trovano il valore minimo usando Math.min.apply, questo non richiede che l'array di input arrsia ordinato . Non dobbiamo preoccuparci degli indici o ordinarli in anticipo.

Spiegherò il codice riga per riga per chiarezza:

  1. arr.map(function(k) { return Math.abs(k - x) })Crea un nuovo array, essenzialmente memorizzando i valori assoluti dei numeri dati (numero in arr) meno il numero di input ( x). Quindi cercheremo il numero più piccolo (che è anche il più vicino al numero di input)
  2. Math.min.apply(Math, indexArr) Questo è un modo legittimo per trovare il numero più piccolo nell'array che abbiamo appena creato prima (niente di più)
  3. arr[indexArr.indexOf(min)]Questa è forse la parte più interessante. Abbiamo trovato il nostro numero più piccolo, ma non siamo sicuri se dovremmo aggiungere o sottrarre il numero iniziale ( x). Questo perché abbiamo Math.abs()trovato la differenza. Tuttavia, array.mapcrea (logicamente) una mappa dell'array di input, mantenendo gli indici nello stesso posto. Pertanto, per scoprire il numero più vicino, restituiamo semplicemente l'indice del minimo trovato nell'array specificato indexArr.indexOf(min).

Ho creato un cestino dimostrandolo.


1
Non lo so, ma immagino che si possano avere dubbi sulle prestazioni dato che questo è praticamente 3ned è ES5 anche se si risponde nel 2016 e altre soluzioni vanno bene anche se questo noob che ha posto questa domanda chiaramente non era un programmatore al momento.
noob,

1
Sì, è bello vederti imparare! A proposito, ho solo parlato dei dubbi sulle prestazioni, non sostenendo che in realtà ha funzionato peggio, ma ho eseguito i numeri per te e la tua O(n)soluzione esegue circa 100k op / sec in meno rispetto O(log n)a @paxdiablo su numeri casuali. Quando si progetta un algoritmo, ordinare sempre per primo, dicono. (Tranne se sai cosa stai facendo e hai dei benchmark per
supportarti

1
Puntelli per la soluzione semplice. Funziona benissimo per il mio caso d'uso (non ho il lusso di avere un array preordinato come fa noob.)
jaggedsoft,

2
È possibile rendere findClosest restituisce una funzione di riduzione della richiamata per renderla riutilizzabile su tutti gli array: const findClosest = goal => (a,b) => Math.abs(a - goal) < Math.abs(b - goal) ? a : b;
Jakob E

1
Esempio: [2, 42, 82, 122, 162, 202, 242, 282, 322, 362].reduce(findClosest(80))
Jakob E

11

Per array ordinati (ricerca lineare)

Tutte le risposte finora si concentrano sulla ricerca nell'intero array. Considerando che il tuo array è già ordinato e vuoi davvero solo il numero più vicino, questa è probabilmente la soluzione più veloce:

var a = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
var target = 90000;

/**
 * Returns the closest number from a sorted array.
 **/
function closest(arr, target) {
  if (!(arr) || arr.length == 0)
    return null;
  if (arr.length == 1)
    return arr[0];

  for (var i = 1; i < arr.length; i++) {
    // As soon as a number bigger than target is found, return the previous or current
    // number depending on which has smaller difference to the target.
    if (arr[i] > target) {
      var p = arr[i - 1];
      var c = arr[i]
      return Math.abs(p - target) < Math.abs(c - target) ? p : c;
    }
  }
  // No number in array is bigger so return the last.
  return arr[arr.length - 1];
}

// Trying it out
console.log(closest(a, target));

Si noti che l'algoritmo può essere notevolmente migliorato, ad esempio utilizzando un albero binario.


Mentre questa strategia qui è buona, ha diversi errori di battitura. Esempio a[i]o i[0].
Wesley Workman,

1
Grazie, @WesleyWorkman. Li ho appena riparati. Spero di aver ottenuto tutto. A proposito, puoi anche modificare le risposte degli altri.
Hubert Grzeskowiak,

Dove devo effettuare la correzione nel codice sopra indicato per ottenere il valore più vicino più alto? Esempio: [110, 111, 120, 140, 148, 149, 155, 177, 188, 190] Se cerco 150, dovrei ottenere 155 non 149. Ho provato ma trovando difficoltà nel risolverlo. Potresti per favore aiutare. Grazie
user1199842

9

Tutte le soluzioni sono troppo ingegnerizzate.

È semplice come:

const needle = 5;
const haystack = [1, 2, 3, 4, 5, 6, 7, 8, 9];

haystack.sort((a, b) => {
  return Math.abs(a - needle) - Math.abs(b - needle);
});

// 5

1
Anzi, molto di più al punto. ma per "ottenere il numero più vicino dall'array" devi ancora selezionare il primo elemento dall'array ordinato.
Shaya Ulman,

6

Questa soluzione utilizza il quantificatore esistenziale ES5 Array#some, che consente di interrompere l'iterazione, se viene soddisfatta una condizione.

Al Array#reducecontrario, non è necessario iterare tutti gli elementi per un risultato.

All'interno del callback, viene preso un assoluto deltatra il valore cercato e l'effettivo iteme confrontato con l'ultimo delta. Se maggiore o uguale, l'iterazione si interrompe, poiché tutti gli altri valori con i loro delta sono maggiori del valore effettivo.

Se la voce deltanel callback è più piccola, l'elemento reale viene assegnato al risultato e deltaviene salvato in lastDelta.

Infine, vengono presi valori più piccoli con delta uguali, come nell'esempio seguente di 22, che risulta in 2.

Se esiste una priorità di valori maggiori, il controllo delta deve essere modificato da:

if (delta >= lastDelta) {

per:

if (delta > lastDelta) {
//       ^^^ without equal sign

Ciò porterebbe con 22il risultato 42(Priorità di valori maggiori).

Questa funzione richiede valori ordinati nell'array.


Codice con priorità di valori più piccoli:

function closestValue(array, value) {
    var result,
        lastDelta;

    array.some(function (item) {
        var delta = Math.abs(value - item);
        if (delta >= lastDelta) {
            return true;
        }
        result = item;
        lastDelta = delta;
    });
    return result;
}

var data = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

console.log(21, closestValue(data, 21)); // 2
console.log(22, closestValue(data, 22)); // 2  smaller value
console.log(23, closestValue(data, 23)); // 42
console.log(80, closestValue(data, 80)); // 82

Codice con priorità di valori maggiori:

function closestValue(array, value) {
    var result,
        lastDelta;

    array.some(function (item) {
        var delta = Math.abs(value - item);
        if (delta > lastDelta) {
            return true;
        }
        result = item;
        lastDelta = delta;
    });
    return result;
}

var data = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

console.log(21, closestValue(data, 21)); //  2
console.log(22, closestValue(data, 22)); // 42 greater value
console.log(23, closestValue(data, 23)); // 42
console.log(80, closestValue(data, 80)); // 82


Quindi supponi che l'array dato sia ordinato ... Questo ti fa risparmiare un sacco di tempo.
Redu,

1
l'array dell'op sembra ordinato, quindi sì :)
Nina Scholz,

La prima soluzione si interrompe sugli input che contengono lo stesso numero due volte. ad es.closestValue([ 2, 2, 42, 80 ], 50) === 2
Sébastien Vercammen,

@ SébastienVercammen, i dati di op sono unici e ordinati.
Nina Scholz,

@NinaScholz OP ha determinato solo "Ho un array con numeri in esso" e "Voglio che il numero che ho sia cambiato con il numero più vicino dell'array" . La matrice di esempio era solo un esempio. Un array non garantisce voci uniche.
Sébastien Vercammen,

4

ES6

Funziona con array ordinati e non ordinati

Numeri interi e galleggianti, corde di benvenuto

/**
 * Finds the nearest value in an array of numbers.
 * Example: nearestValue(array, 42)
 * 
 * @param {Array<number>} arr
 * @param {number} val the ideal value for which the nearest or equal should be found
 */
const nearestValue = (arr, val) => arr.reduce((p, n) => (Math.abs(p) > Math.abs(n - val) ? n - val : p), Infinity) + val

Esempi:

let values = [1,2,3,4,5]
console.log(nearestValue(values, 10)) // --> 5
console.log(nearestValue(values, 0)) // --> 1
console.log(nearestValue(values, 2.5)) // --> 2

values = [100,5,90,56]
console.log(nearestValue(values, 42)) // --> 56

values = ['100','5','90','56']
console.log(nearestValue(values, 42)) // --> 56

3

Non so se dovrei rispondere a una vecchia domanda, ma dato che questo post appare prima nelle ricerche di Google, ho sperato che mi avresti perdonato aggiungendo la mia soluzione e il mio 2c qui.

Essendo pigro, non potevo credere che la soluzione per questa domanda sarebbe stata un LOOP, quindi ho cercato un po 'di più e sono tornato con la funzione filtro :

var myArray = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
var myValue = 80;

function BiggerThan(inArray) {
  return inArray > myValue;
}

var arrBiggerElements = myArray.filter(BiggerThan);
var nextElement = Math.min.apply(null, arrBiggerElements);
alert(nextElement);

È tutto !


1
Quindi che dire del limite inferiore? Si utilizza sempre il valore più alto successivo. Ma il tuo approccio mi ricorda goog.math.clamp(chiusura di Google) solo con gli array e senza preoccuparti del limite inferiore.
noob,

La soluzione restituisce il numero successivo successivo dall'array. Non viene trovato né il valore più vicino né quello esatto.
Hubert Grzeskowiak,

2

La mia risposta a una domanda simile è tenere conto anche dei legami ed è in Javascript semplice, sebbene non usi la ricerca binaria, quindi è O (N) e non O (logN):

var searchArray= [0, 30, 60, 90];
var element= 33;

function findClosest(array,elem){
    var minDelta = null;
    var minIndex = null;
    for (var i = 0 ; i<array.length; i++){
        var delta = Math.abs(array[i]-elem);
        if (minDelta == null || delta < minDelta){
            minDelta = delta;
            minIndex = i;
        }
        //if it is a tie return an array of both values
        else if (delta == minDelta) {
            return [array[minIndex],array[i]];
        }//if it has already found the closest value
        else {
            return array[i-1];
        }

    }
    return array[minIndex];
}
var closest = findClosest(searchArray,element);

https://stackoverflow.com/a/26429528/986160


2

Mi piace l'approccio di Fusion, ma c'è un piccolo errore in esso. In questo modo è corretto:

    function closest(array, number) {
        var num = 0;
        for (var i = array.length - 1; i >= 0; i--) {
            if(Math.abs(number - array[i]) < Math.abs(number - array[num])){
                num = i;
            }
        }
        return array[num];
    }

È anche un po 'più veloce perché utilizza il forloop migliorato .

Alla fine ho scritto la mia funzione in questo modo:

    var getClosest = function(number, array) {
        var current = array[0];
        var difference = Math.abs(number - current);
        var index = array.length;
        while (index--) {
            var newDifference = Math.abs(number - array[index]);
            if (newDifference < difference) {
                difference = newDifference;
                current = array[index];
            }
        }
        return current;
    };

L'ho provato con console.time()ed è leggermente più veloce dell'altra funzione.


Ehi, puoi spiegare perché è un improved for loop? I loop invertiti non sono sempre un miglioramento delle prestazioni.
A1rPun

Valuta .lengthuna sola volta, quando dichiari i, mentre per questo ciclo. Ma penso che var i = arr.length;while (i--) {}sarebbe ancora più veloce
Jon

Ho aggiornato la mia risposta. L'ho cambiato in while. Ora è ancora più veloce.
Jon

0

Una ricerca binaria leggermente modificata sull'array funzionerebbe.


3
Accidenti, è strano - a quanto pare a qualcuno non piacciono le ricerche binarie. (Anche pensato che sia la migliore soluzione generale.)
Hot Licks il

0

Per un piccolo intervallo, la cosa più semplice è avere un array di mappe, dove, ad esempio, l'80a voce avrebbe il valore 82 in essa, per usare il tuo esempio. Per un intervallo molto più ampio e scarso, probabilmente la strada da percorrere è una ricerca binaria.

Con un linguaggio di query è possibile eseguire una query per valori a una certa distanza su entrambi i lati del numero di input e quindi ordinare l'elenco ridotto risultante. Ma SQL non ha un buon concetto di "prossimo" o "precedente", per darti una soluzione "pulita".


0

Un'altra variante qui abbiamo un intervallo circolare che collega la testa ai piedi e accetta solo il valore minimo per l'input dato. Ciò mi aveva aiutato a ottenere i valori del codice char per uno degli algoritmi di crittografia.

function closestNumberInCircularRange(codes, charCode) {
  return codes.reduce((p_code, c_code)=>{
    if(((Math.abs(p_code-charCode) > Math.abs(c_code-charCode)) || p_code > charCode) && c_code < charCode){
      return c_code;
    }else if(p_code < charCode){
      return p_code;
    }else if(p_code > charCode && c_code > charCode){
      return Math.max.apply(Math, [p_code, c_code]);
    }
    return p_code;
  });
}

0
#include <algorithm>
#include <iostream>
#include <cmath>

using namespace std;

class CompareFunctor
{

public:
    CompareFunctor(int n) { _n = n; }
    bool operator()(int & val1, int & val2)
    {
        int diff1 = abs(val1 - _n);
        int diff2 = abs(val2 - _n);
        return (diff1 < diff2);
    }

private:
    int _n;
};

int Find_Closest_Value(int nums[], int size, int n)
{
    CompareFunctor cf(n);
    int cn = *min_element(nums, nums + size, cf);
    return cn;
}

int main()
{
    int nums[] = { 2, 42, 82, 122, 162, 202, 242, 282, 322, 362 };
    int size = sizeof(nums) / sizeof(int);
    int n = 80;
    int cn = Find_Closest_Value(nums, size, n);
    cout << "\nClosest value = " << cn << endl;
    cin.get();
}

0

La più efficiente sarebbe una ricerca binaria. Tuttavia, anche le soluzioni semplici possono uscire quando il numero successivo è un'ulteriore corrispondenza dalla corrente . Quasi tutte le soluzioni qui non tengono conto del fatto che l'array sia ordinato e iterando nel complesso: /

const closest = (orderedArray, value, valueGetter = item => item) =>
  orderedArray.find((item, i) =>
    i === orderedArray.length - 1 ||
    Math.abs(value - valueGetter(item)) < Math.abs(value - valueGetter(orderedArray[i + 1])));

var data = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

console.log('21 -> 2', closest(data, 21) === 2);
console.log('22 -> 42', closest(data, 22) === 42); // equidistant between 2 and 42, select highest
console.log('23 -> 42', closest(data, 23) === 42);
console.log('80 -> 82', closest(data, 80) === 82);

Questo può essere eseguito anche su non primitivi, ad es closest(data, 21, item => item.age)

Passare finda findIndexper restituire l'indice nella matrice.


Che dire dell'array non ordinato?
EdG

Per non ordinate, prendi una delle soluzioni che non esce, tuttavia se stai facendo il lavoro più volte, potrebbe essere più ottimale ordinare l'array una volta. Come accennato se l'array è veramente grande, una ricerca binaria sarà più efficiente di una lineare.
Dominic

0

Per trovare il numero più vicino nell'array

function findTwoClosest(givenList, goal) {
  var first;
  var second;
  var finalCollection = [givenList[0], givenList[1]];
  givenList.forEach((item, firtIndex) => {
    first = item;

    for (let i = firtIndex + 1; i < givenList.length; i++) {
      second = givenList[i];

      if (first + second < goal) {
        if (first + second > finalCollection[0] + finalCollection[1]) {
          finalCollection = [first, second];
        }
      }
    }
  });

  return finalCollection;
}

var counts = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]
var goal = 80;
console.log(findTwoClosest(counts, goal));

-5

Ecco lo snippet di codice per trovare l'elemento più vicino a un numero di un array in Complexity O (nlog (n)): -

Input: - {1,60,0, -10.100,87,56} Elemento: - 56 Numero più vicino nell'array: - 60

Codice sorgente (Java):

package com.algo.closestnumberinarray;
import java.util.TreeMap;


public class Find_Closest_Number_In_Array {

    public static void main(String arsg[]) {
        int array[] = { 1, 60, 0, -10, 100, 87, 69 };
        int number = 56;
        int num = getClosestNumber(array, number);
        System.out.println("Number is=" + num);
    }

    public static int getClosestNumber(int[] array, int number) {
        int diff[] = new int[array.length];

        TreeMap<Integer, Integer> keyVal = new TreeMap<Integer, Integer>();
        for (int i = 0; i < array.length; i++) {

            if (array[i] > number) {
                diff[i] = array[i] - number;
                keyVal.put(diff[i], array[i]);
            } else {
                diff[i] = number - array[i];
                keyVal.put(diff[i], array[i]);
            }

        }

        int closestKey = keyVal.firstKey();
        int closestVal = keyVal.get(closestKey);

        return closestVal;
    }
}

Post ha chiesto javascript nei tag
Shannon Hochkins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.