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

从数组中查找第二个最小元素

从数组中查找第二个最小元素

慕码人8056858 2021-06-10 14:06:03
任何人都可以将其转换为 Java 函数式风格 (lambda):public int findSecondMin(int arr[]) {    int min = Integer.MAX_VALUE, secondMin = Integer.MAX_VALUE;    for (int i = 0; i < arr.length; i++) {        if (min > arr[i]) {            secondMin = min;            min = arr[i];        } else if (secondMin > arr[i]) {            secondMin = arr[i];        }    }    return secondMin;}我尝试通过应用过滤器来解决这个问题,但它不起作用。
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

使用IntStream,您可以轻松对其进行排序并跳过第一个元素:


public int findSecondMin(int[] arr)

{

    return IntStream.of(arr).sorted().skip(1).findFirst().orElse(Integer.MAX_VALUE);

}

但是,当然,您不必使用流。java.util.Arrays有一个很好的排序方法,然后你可以只取第二个元素:


public int findSecondMin(int[] arr)

{

    Arrays.sort(arr);

    return arr.length < 2 ? Integer.MAX_VALUE : arr[1];

}

为了避免对整个数组进行排序,我们可以采用您的方法并将其调整为流上的自定义缩减:


public int findSecondMin(int[] arr)

{

    return IntStream.of(arr).boxed().reduce(

        new int[] {Integer.MAX_VALUE, Integer.MAX_VALUE},

        (mins, i) -> {

            return new int[] {Math.min(i, mins[0]), Math.min(Math.max(i, mins[0]), mins[1])};

        }, (mins1, mins2) -> {

            int[] lesser = mins1[0] < mins2[0] ? mins1 : mins2;

            int[] larger = mins1[0] < mins2[0] ? mins2 : mins1;

            return new int[] {lesser[0], Math.min(lesser[1], larger[0])};

        }

    )[1];

}

与基于 for 循环的实现相比,它可能更难阅读,但可以并行工作。


查看完整回答
反对 回复 2021-06-30
?
湖上湖

TA贡献2003条经验 获得超2个赞

在所有数字都是唯一的情况下,即使没有排序也有一种方法。过滤掉最小值并再次请求另一个导致第二个最低值的值。


int firstMin = Arrays.stream(arr).min().getAsInt();

int secondMin = Arrays.stream(arr).filter(i -> i != firstMin).min().getAsInt();


System.out.println(firstMin);  // prints 2

System.out.println(secondMin); // prints 3

编辑:还有另一种使用TreeSet存储已排序值的实现的方法。删除最低的元素并再次请求第一个元素 - 结果是第二个最低的元素:


SortedSet<Integer> sortedSet = Arrays.stream(arr)

                                     .boxed()

                                     .collect(Collectors

                                         .toCollection(TreeSet::new));

sortedSet.remove(sortedSet.first());

int secondMin = sortedSet.first();


System.out.println(secondMin); // prints 3


查看完整回答
反对 回复 2021-06-30
?
当年话下

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

public int min(){

  int a[] ={2,5,1,3};

  int min, secondMin = a[0];

  for(int i=0;i<a.length;i++){

        if(min>a[i]){

             secondMin =min;

             min= a[i];

           }

      }

  return secondMin;

}

我从上面的代码段得到了第二分钟...试试这个.....


查看完整回答
反对 回复 2021-06-30
  • 3 回答
  • 0 关注
  • 188 浏览

添加回答

举报

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