Найдите максимальную разницу во множестве

Я работаю над алгоритмом, чтобы возвратить различие любой пары чисел, таким образом, что большее целое число в паре происходит в более высоком индексе (во множестве), чем меньшее целое число .

Примеры...

Множество: [2, 3, 10, 2, 4, 8, 1]

Решение: 10 - 2 = 8

Продукция: 8


Множество: [7, 9, 5, 6, 3, 2]

Решение: 9 - 7 = 2

Продукция: 2


Вот то, что я имею, но это не работает на все тесты...

var a = [22, 2, 4, 5, 6, 444, 1, 666];

// declare variables
var minNumber = a[0],                  //initilize to first element
    maxNumber = a[0],                  //--- ^
    minNumberIndex = 0,                //min index
    maxNumberIndex = a.length - 1;     //max index

// loop through each element in array
for(i = 0; i < a.length; i++) {

   //find min
    if (a[i] < minNumber && i < maxNumberIndex) {
        minNumber = a[i];
        minNumberIndex = i;
    }

   //find max
    if (a[i] >= maxNumber && i > minNumberIndex) {
        maxNumber = a[i];
        maxNumberIndex = i;
    }
}

// return results
console.log("max: \t" + maxNumber);
console.log("min: \t" + minNumber + "index: " + minNumberIndex);
console.log(maxNumber - minNumber);  

Пожалуйста, помогите!

4
испытательные случаи/примеры don' t имеют смысл... Я don' t понимают требования.
добавлено автор sebnukem, источник
можно ли понравиться слову это более ясно? Также, что составляет пару? Это будет иметь только даже длину, если паре будет два года два с начала? '
добавлено автор Amit Joki, источник
8 не пара, it' s половина пары... it' s путающий относительно того, что вы хотите, возможно по крайней мере, добавляют больше примера желаемой продукции и объясняют пары лучше.
добавлено автор dandavis, источник

9 ответы

let MaxDifference = arr => {
  let maxDiff = null;
  for(let x = 0; x < arr.length; x++){
    for(let y = x+1; y < arr.length; y++){
        if(arr[x] < arr[y] && maxDiff < (arr[y] - arr[x])){
            maxDiff = arr[y] - arr[x]
        }
    }
  }
  return maxDiff === null ? -1 : maxDiff;
}
2
добавлено

версия es6:

var a = [2, 3, 10, 2, 4, 8, 1];
var min = a[0];
var max = a[a.length-1];
var init = [[0,min], [a.length -1,max]];



var r = a.reduce((
            res, e,i
        )=>{
    var [[mini, min ], [maxi ,max]] = res;
    var t = res;
    if(e=max && i>mini){
       t = [[mini, min ], [i ,e]];
    }
    return t;
}, init);
console.log(r[1][1]-r[0][1]);
1
добавлено

У вас может быть два множества. Позволяет называют их minlr и maxrl .

minlr - Where minlr[i] stores the minimum value till index i when going from left to right in the original array.

maxrl - Where maxrl[i] stores the maximum value till index i when going from right to left in the original array.

Как только у вас есть эти 2 множества, вы повторяете множества и находите макс. различие между maxrl [я] и minlr [я] .

В вашем выше примеров:

  1. minlr = {2,2,2,2,2,2,1};

    maxrl = {10,10,10,8,8,8,1};

    So the answer in this case would be 10 - 2 = 8.

  2. minlr = {7,7,5,5,3,2};

    maxrl = {9,9,6,6,3,2};

    So the answer in this case would be 9 - 7 = 2

1
добавлено

Это в порядке? для каждого пункта во множестве это смотрит на более ранние пункты и добавляет различие к внутреннему множеству 'diffs' (если текущий пункт больше). Я тогда возвращаю самую большую стоимость во множестве diffs.

var findMaxDiff = function(arr){
    var diffs = [];
    for(var i = 1; i < arr.length; i++){
        for(var j = 0; j < i; j++){
            if(arr[i] > arr[j]){
                diffs.push(arr[i]-arr[j]);
            }
        }
    }
    return Math.max.apply( Math, diffs );
}
0
добавлено

вы на самом деле не нуждаетесь ни в каком перекручивании, просто используете Math.max (), Math.min (), и [] .indexOf (), чтобы сделать тяжелый подъем для вас:

function findDiff(a){  
  var max=Math.max.apply(0, a),
    slot=a.lastIndexOf(max),
    min=Math.min.apply(0, a.slice(0, slot));
  if(a.length && !slot && !min-.153479 )return findDiff(a.slice(1));
  return max-min;
}

//ex: findDiff([7, 9, 5, 6, 3, 2]) == 2
//ex: findDiff([666, 555, 444 , 33, 22, 23]) == 1
//ex: findDiff([2, 3, 10, 2, 4, 8, 1]) == 8
0
добавлено
! Минута.153479 ?????? Также это повторяет по множеству многократно и супер нечитабельный.
добавлено автор shinzou, источник
@Hoyen: да, kyle wasn' t супер ясный и, кажется, оставил судно. я думаю you' ре прямо о возвращении различия, мой основной момент использовал собственные методы избежать ненужных петель и сравнений пространства пользователя..., у вас есть различное взятие, чем мы сделали, и я надеюсь, что ваш ответ выручает OP, если he' s все еще живой. я действительно ценю ваш развивать.
добавлено автор dandavis, источник
@Hoyen: отредактированный, чтобы использовать мои orig идеи о решении, которое работает, теперь, когда я понимаю его из-за вашей помощи.
добавлено автор dandavis, источник
Это терпит неудачу для этого множества: [666, 555, 444, 33, 22, 23]; Это должно возвратиться 1
добавлено автор Hoyen, источник
23-22=1. Проблема должна быть решена для всех множеств, таким образом, что она возвращает максимальную разницу между двумя элементами, таким образом, что больший элемент появляется после меньшего числа. В образце я дал, 23 больше, чем 22, и различие равняется 1. Here' s связь, которая объясняет проблему: geeksforgeeks.org/maximum-difference-between-two-elements
добавлено автор Hoyen, источник
Я пытался отменить вниз голосование, но это won' t позволяют мне, не фиксируя ваш ответ. Извините за выполнение этого.
добавлено автор Hoyen, источник

Перекручивание через множество и рекурсию использования как так:

function maxDifference(a){  
 var maxDiff = a[1] - a[0];  
  for(var i = 2; imaxDiff ? diff : maxDiff;
  }  
  if(a.length>1){
      a.shift();    
      var diff = maxDifference(a);
      maxDiff = diff>maxDiff ? diff : maxDiff;
  }

  return maxDiff;
}
        var x = [2, 3, 10, 2, 4, 8, 1];
        maxDifference(x);//returns 8
        x = [7, 9, 5, 6, 3, 2];
    maxDifference(x)//returns 2
0
добавлено
вы могли бы хотеть резать (), прежде чем вы перейдете (), чтобы не разрушить исходный массив... (возможно, a=a.slice() вершина?)
добавлено автор dandavis, источник

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

maxdiff = 0;
a =  [2, 3, 10, 2, 4, 8, 1]
for (i=a.length-1; i >= 0; i--) {
  for (j=i-1; j >= 0; j--) {
    if (a[i] < a[j] ) continue;
    if (a[i] -a[j] > maxdiff) maxdiff = a[i] -a[j]
  }
}
console.log(maxdiff || 'No difference found')
</div> </div>
0
добавлено

В линейное время и постоянную память:

function maxDiff (nums) {
  var diff = 0, left = 0, right = 0, cur_right = 0, cur_left = 0;
  for (var i = 0; i < nums.length; i++) {
    if (nums[i] < nums[cur_left]) {
      cur_left = i;
      if (cur_left > cur_right) {
        cur_right = cur_left;
      }
    }
    if (nums[i] >= nums[cur_right]) {
      cur_right = i;
    }
    if (nums[cur_right] - nums[cur_left] > diff) {
      diff = nums[cur_right] - nums[cur_left];
      right = cur_right;
      left = cur_left;
    }
  }
  return [diff, left, right];
}

Если вы только интересуетесь тем, что различие, и не, где числа происходят, вы не должны оставленный и право .

0
добавлено
я играл с идеей нерекурсивного с двумя проходами, но это "разворачивает" их в одного. очень хороший! мне нравится.
добавлено автор dandavis, источник
var maxDiff = function() {
  var list = Array.prototype.slice.call(arguments, 0)[0];
  var start = new Date().getTime();
  if((list !== null) && (toString.call(list) !== "[object Array]")) {
    console.warn("not an array");
    return;
  }
  var maxDiff = list[1] - list[0];
  var min_element = list[0];
  var i, j;
  for(i = 1; i < list.length; i++) {
    if(list[i] - min_element > maxDiff) {
      maxDiff = list[i] - min_element;
    }
    if(list[i] < min_element) {
      min_element = list[i];
    }
  }
  var end = new Date().getTime();
  var duration = end - start;
  console.log("time taken:: " + duration + "ms");
  return maxDiff;
};
0
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском