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

Javascript 查找给定数组中的最小值和最大值,其中约束应为最小值,索引应小于其最大值,javascript,node.js,arrays,performance,min,Javascript,Node.js,Arrays,Performance,Min,给定数组[“1510”、“1518”、“1520”、“1523”、“1530”、“1483”、“1485”] 预期产出:- Smallest - 1510 Largest - 1530 Smallest - 310 Largest - 330 另一个数组[“310”、“314”、“320”、“319”、“323”、“313”、“330”] 预期产出:- Smallest - 1510 Largest - 1530 Smallest - 310 Largest - 330 下面我的代码得到

给定数组[“1510”、“1518”、“1520”、“1523”、“1530”、“1483”、“1485”] 预期产出:-

Smallest - 1510
Largest - 1530
Smallest - 310
Largest - 330
另一个数组[“310”、“314”、“320”、“319”、“323”、“313”、“330”] 预期产出:-

Smallest - 1510
Largest - 1530
Smallest - 310
Largest - 330
下面我的代码得到了最小值和最大值,它在解决上面列出的第一个问题时遇到了问题,因为它返回的最小值是1483,最大值是1485。最大值和最小值之间的差异应该更大

你知道怎么做吗

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];
}
函数最小值(数组){
if(array.length=max_索引){
阵列拼接(最大索引,1);
[min,max]=minMax(数组);
}
返回值[最小值,最大值];
}

单次通过阵列:

  • 从数组的末尾迭代到数组的开头
  • 跟踪最大值和最小值以及最小/最大值对列表
  • 检查每一项
    • 如果找到的项目超过当前最大值,
      • 将当前最小/最大值添加到对列表中
      • 将当前项设为最大值,并重置最小值
    • 否则,如果当前项小于当前最小值,则将其设为最小值
    • 否则什么也不做
  • 然后将最后一个最小/最大对添加到列表中
  • 此时,您有一个要返回的潜在最小/最大对的列表。您必须从头到尾检查它们,以找到设置了最小值的第一个并返回它。或者返回一组默认的最小值/最大值

    函数最小最大值(arr){
    设max=-无穷大;
    设min=无穷大;
    常量候选者=[];
    对于(设i=arr.length-1;i>=0;i--){
    常数项=数量(arr[i]);
    如果(项目>最大值){
    候选项。推送([最小值,最大值]);
    最大值=项目;
    最小值=无穷大;
    }否则如果(项目<最小值){
    最小值=项目;
    }
    }
    候选项。推送([最小值,最大值]);
    //代码将从有限的最后一个元素返回第一个元素,而不是返回固定的第一个或最后一个元素。
    for(设i=candidates.length-1;i>=0;i--){
    if(Number.isFinite(候选者[i][0])返回候选者[i];
    }
    返回[0,0];
    }
    log(最小值([“1510”、“1518”、“1520”、“1523”、“1530”、“1483”、“1485”));
    log(最小值([“310”、“314”、“320”、“319”、“323”、“313”、“330”);
    log(最小值([“350”、“314”、“320”、“319”、“323”、“313”、“330”);
    log(最小值([“7”、“6”、“1”、“2”));
    
    log(最小值([“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];
    }
    
    你可以

    • 取局部最小值和最大值的数组
    • 如果两个值都存在,则将它们分组为最小和最大对
    • 如果在较大索引上找到一个,则更改最大值
    • 获取具有最大增量的一对
    函数最小最大值(数字){
    返回号码
    .减少((r,v,i,a)=>{
    如果(!(r.length&1)==a[i-1]{
    如果(i&1)r.push([a[i-1],v]);
    返回r;
    }, [])
    .reduce((r,[min,max],i,a)=>(r | | a).map([left,right],j)=>[
    左边
    i>j&&max>对吗?max:对
    ]),未定义)
    .reduce((a,b)=>a[1]-a[0]>=b[1]-b[0]-a:b);
    }
    log(最小值([1510151815201523153014831485]);//1510 1530
    log(最小值([310314320319330]);//310  330
    log(最小值([9,3,4,1]);//3.4
    .as控制台包装{最大高度:100%!重要;顶部:0;}
    此问题与相同。你首先需要以最大可能的价格买进并卖出股票。所以在每个索引中,你需要知道右边最大的元素

  • 从末尾遍历数组,并在每个索引处存储到目前为止的max元素。
    对于列表[1510、1518、1520、1523、1530、1483、1485],maxList将看起来像[1530、1530、1530、1530、1485、1485]差异[20、12、10、7、0、2、0],所以答案将是1510和1530。

  • 顺便说一句,为什么数组中没有数字?如果数组按描述顺序排序,如
    [3,2,1]
    这里的最小值和最大值是多少?有两个可能的答案:[绝对最小元素,右边的最大值]或[绝对最大元素,左边的最小值]。你在找哪一个?@Akhil,数组不应该排序。它只能是未排序的数组。@NinaScholz,您可以将其作为数字数组。这正是我正在研究的东西,它将数组元素作为字符串(这是一个数字),它可以工作,但会给数组带来这样的问题[“350”,“314”,“320”,“319”,“323”,“313”,“330”]。这个数组的最小值应该是314,最大值应该是330。@KailashPrabhu我知道了,我不知道是这样的。如果是那样的话,我得考虑一下。谢谢。这很好用,也可以理解。尽管尼娜的答案有效。将此标记为答案,因为代码复杂度低于Nina的。
    [7,6,1,2]=>[Infinity,6]
    @georg,在您的数组中,它应该返回1作为最小值,2作为最大值。希望这样可以消除混淆。哎呀!我说得太快了。是的,看起来上面的情况下,VLAZ代码返回无穷大。太好了!这将返回我正在搜索的预期值。但它确实看起来很复杂。有没有办法详细解释一下?这将更容易理解它是如何工作的。@georg,看起来尼娜的实现处理得很好。在案例
    [7,6,1,2]
    中,它将预期值min返回为1,max返回为2。