为了账号安全,请及时绑定邮箱和手机立即绑定

查找元素最大值最小的数组

查找元素最大值最小的数组

慕姐8265434 2022-12-15 16:35:02
我有一个 int[] 数组的数组列表,我试图找到具有最低最大元素的数组。例如,对于数组 [1,2,5]、[0,1,2]、[8,0,0],它将是数组 [0,1,2],因为最大元素为 2。但是,我的代码无法正常工作。你能帮我修复我的代码吗?谢谢!int min = Integer.MAX_VALUE;for (int i=0; i<list.size(); i++) {    for (int j=0; j<list.get(i).length; j++) {        if (list.get(i)[j]<min) {            min = list.get(i)[i];             minIndex = i; //index of the array in arraylist        }    }}
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您的代码在所有数组中找到最低值(至少如果您修复 to 的拼写错误,它会list.get(i)[i])list.get(i)[j]。


您应该找到每个数组的最大元素,然后检查该最大值是否小于所有先前找到的最大值:


int minIndex = 0;

int min = Integer.MAX_VALUE;

for (int i=0; i<list.size(); i++) {

    int max = Integer.MIN_VALUE;

    for (int j=0; j<list.get(i).length; j++) { // find max element of current array

        if (list.get(i)[j] > max) {

            max = list.get(i)[j]; 

            if (max > min) {

                break; // we already know the max of this array is not the smallest max

            }

        }

    }

    if (max < min) { // check if the max of the current array is the smallest max so far

        min = max;

        minIndex = i; //index of the array in arraylist

    }

}


查看完整回答
反对 回复 2022-12-15
?
噜噜哒

TA贡献1784条经验 获得超7个赞

你可以试试这个,例如:


import java.util.Arrays;

import java.util.Comparator;


public class MaxMinArray {


    public static int[]  maxMinFromArray(int[][] arrays){

       return  Arrays.stream(arrays).min(Comparator.comparingInt(x -> Arrays.stream(x).max().orElse(0))).orElse(null);

    }

}

我已经用你的例子测试过了 :) :


import org.junit.Test;


import static org.junit.Assert.*;


public class MaxMinArrayTest {


    @Test

    public void testMaxMinArray(){

        int[][] arrays = new int[][] {{1,2,5}, {0,1,2}, {8,0,0}};

        int[] result = MaxMinArray.maxMinFromArray(arrays);

        assertArrayEquals(new int[]{0,1,2}, result);

    }

}


查看完整回答
反对 回复 2022-12-15
?
青春有我

TA贡献1784条经验 获得超8个赞

作为 for 循环的替代方法,您可以尝试使用stream api来解决此问题。这个想法是完全一样的:


在每个子列表中找到最大元素。

使用Comparator在最大元素中查找具有最小元素的子列表。

List.of(List.of(1, 2, 5), List.of(0, 1, 2), List.of(8, 0, 0)) 

        .stream()

        .min((a, b) ->  

               a.stream().max(Integer::compare).get()

                 .compareTo(

                    b.stream().max(Integer::compare).get()

                 )

        ).get(); 

代码更少,可以说很容易理解代码的意图。您甚至可以使用以下方法缩短代码Comparator::comparing:


List.of(List.of(1, 2, 5), List.of(0, 1, 2), List.of(8, 0, 0))

        .stream()

        .min(Comparator.comparing(Collections::max))

        .get();

让我们更详细地看看这里发生了什么。


List.of(List.of(1, 2, 5), List.of(0, 1, 2), List.of(8, 0, 0))

        // lets get stream of list Stream<List<Integer>>. 

        .stream()

        // find sublist which has minimum maximum element. 

        .min((a, b) ->  

               // a & b are sublist, for example: [1,2,5], [0,1,2]

               // find maximum from a [1,2,5] which is [5]

               a.stream().max(Integer::compare).get()

               // compare maximum from a to maximum from b 

                 .compareTo(

                 // find maximum from a [0,1,2] which is [2]

                    b.stream().max(Integer::compare).get()

                 )

               // get minimum out of [5,2]

        ).get(); // [0, 1, 2]

所以执行可能看起来类似于这样:


Initial list is: [1,2,5], [0,1,2], [8, 0, 0]

find minimum list based on maximum: 

min( max([1,2,5]), max([0,1,2])) 

min( [5], [2]) 

[2] -> list [0,1,2] contains minimum maximum element so far, go the the next iteration

find minimum list based on maximum: 

min( max([0,1,2]), max([8, 0, 0]) ) 

min( [2], [8]) 

[2] -> list [0,1,2] contains minimum maximum element so far, 

there no other element in the stream, [0,1,2] is final result. 

希望这个对你有帮助。


查看完整回答
反对 回复 2022-12-15
  • 3 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信