在给定数组中查找最小值和最大值,其中约束应最小值索引应小于其最大值

Find Minimum and Maximum in given array where constraints should minimum value index should be less than its maximum

给定数组 ["1510", "1518", "1520", "1523", "1530", "1483", "1485"] 预期输出:-

Smallest - 1510
Largest - 1530

另一个数组["310", "314", "320", "319", "323", "313", "330"] 预期输出:-

Smallest - 310
Largest - 330

我下面的代码获取最小值和最大值它在解决上面列出的第一个问题时遇到问题,因为它返回最小值 1483 和最大值 1485。 max 和 min 之间的差异应该更大。

知道如何获得吗?

function minMax(array) {
    if(array.length <= 0) return [0, 0];
    let max = Math.max.apply(null, array);
    let min = Math.min.apply(null, array);
    let max_index = array.lastIndexOf(String(max));
    let min_index = array.indexOf(String(min));
    if(min_index >= max_index) {
        array.splice(max_index, 1);
        [min, max] = minMax(array);
    }
    return [min, max];
}

一次遍历数组:

  1. 从数组末尾迭代到开头。
  2. 跟踪最大值和最小值以及 min/max 对列表
  3. 勾选每一项
    • 如果找到的项目超过当前最大值,
      • 将当前 min/max 添加到配对列表中
      • 将当前项目设为最大值并重置最小值
    • 否则,如果当前项目小于当前最小值,则将其设置为最小值。
    • 否则什么也不做。
  4. 然后将最后 min/max 对添加到列表中。

此时您有一个潜在 min/max 对 return 的列表。您必须从头到尾检查它们,以找到第一个设置了最小值的,然后 return 它。或 return 默认设置 min/max.

function minMax(arr) {
  let max = -Infinity;
  let min = Infinity;
  const candidates = [];
  for (let i = arr.length-1; i >= 0; i--) {
    const item = Number(arr[i]);
    if (item > max) {
      candidates.push([min, max]);
      max = item;
      min = Infinity;
    } else if (item < min) {
      min = item;
    }
  }
  candidates.push([min, max]);

  // Instead of return fixed first or last element below code would return first element from last which is finite.
  for(let i = candidates.length - 1; i >= 0; i--) {
      if(Number.isFinite(candidates[i][0])) return candidates[i];
   }
   return [0, 0];
}
console.log(minMax(["1510", "1518", "1520", "1523", "1530", "1483", "1485"]));
console.log(minMax(["310", "314", "320", "319", "323", "313", "330"]));
console.log(minMax(["350", "314", "320", "319", "323", "313", "330"]));
console.log(minMax(["7", "6", "1", "2"]));
console.log(minMax(["4", "3", "2", "1"]));

您可以使用类似下面的内容

function minMax(array) {
    let max = Math.max.apply(null,array)
    let newArray= array.slice(0,array.indexOf(+max)-1)
    let min=Math.min.apply(null, newArray);
    return [min, max];
}

你可以

  • 获取局部最小值和最大值的数组,
  • 将它们分组为最小和最大对,如果两个值都存在,
  • 如果在更大的索引上找到一个,则更改最大值,
  • 得到增量最大的一对。

function minMax(numbers) {
    return numbers
        .reduce((r, v, i, a) => {
            if (!(r.length & 1) === a[i - 1] < v) r[r.length - 1] = v;
            else r.push(v);
            return r;
        }, [])
        .reduce((r, v, i, a) => {
            if (i & 1) r.push([a[i - 1], v]);
            return r;
        }, [])
        .reduce((r, [min, max], i, a) => (r || a).map(([left, right], j) => [
            left,
            i > j && max > right ? max : right
        ]), undefined)
        .reduce((a, b) => a[1] - a[0] >= b[1] - b[0] ? a : b);

}

console.log(minMax([1510, 1518, 1520, 1523, 1530, 1483, 1485])); // 1510 1530
console.log(minMax([310, 314, 320, 319, 323, 313, 330]));        //  310  330
console.log(minMax([9, 3, 4, 1]));                               //    3    4
.as-console-wrapper { max-height: 100% !important; top: 0; }

此问题与buy and sell stock相同。您首先需要买入股票并尽可能卖出。因此,在每个索引处,您需要知道右侧最大的元素。

  1. 从末尾开始遍历数组,在每个索引处存储目前最大的元素。 For the list [1510, 1518, 1520, 1523, 1530, 1483, 1485] maxList will look like [1530, 1530, 1530, 1530, 1530, 1485, 1485] difference [20, 12, 10, 7, 0, 2, 0 ] so answer will be 1510 and 1530.