配列の最大の違いを見つける

私は、ペアの大きい方の整数が小さい方の整数よりも高いインデックス(配列内)で発生するように、違いのペアを返すアルゴリズムに取り組んでいます/強い>。

例...

配列:[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
テストケース/例は意味がありません...要件がわかりません。
追加された 著者 sebnukem,
もっと明確にそれを言い表してください。また、ペアを構成するものは何ですか?ペアが始めから2対2であれば、それは偶数の長さだけでしょうか?」
追加された 著者 Amit Joki,
8はペアではありません、それはペアの半分です。
追加された 著者 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
追加された

あなたは2つの配列を持つことができます。 minlrmaxrl と呼びましょう。

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 [i]minlr [i] の最大差を見つけます。

上記の例では:

  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
追加された
!min-.153479 ??????また、これは配列を複数回繰り返し、非常に読めなくなります。
追加された 著者 shinzou,
@ホーエン:ええ、カイルはあまり明確ではなかったし、船を放棄したようだ。私はあなたが違いを返すことについて正しいと思います、私の主なポイントは不必要なループとユーザーと土地の比較を避けるためにネイティブメソッドを使用することでした。彼がまだ生きているなら。私はあなたのフォローアップに感謝します。
追加された 著者 dandavis,
@ホイエン:私はあなたの助けのおかげで私はそれを理解している今、うまくいく解決策上で私の起源のアイデアを使用するように編集しました。
追加された 著者 dandavis,
この配列には失敗します。 1を返すはずです
追加された 著者 Hoyen,
23-22 = 1 2つの要素間の差が最大になるように、小さい方の要素の後に大きい要素が表示されるように、すべての配列について問題を解決する必要があります。私が与えたサンプルでは、​​23は22より大きく、違いは1です。これは問題を説明するリンクです。 geeksforgeeks.org/maximum-difference-between-two-elements
追加された 著者 Hoyen,
私は投票を元に戻そうとしました、しかしそれはあなたの答えを直さないと私をさせません。ごめんなさい。
追加された 著者 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
追加された
元の配列を破壊しないようにするために、shift()の前に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];
}

違いが何であるのかにだけ興味があり、数字がどこにあるのかに興味がなければ、 leftright は必要ありません。

0
追加された
私は非再帰的な2パスのアイデアをいじっていましたが、これはそれらを1つに「展開」します。非常に素晴らしい!好き。
追加された 著者 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 - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript