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 循环的实现相比,它可能更难阅读,但可以并行工作。
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
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;
}
我从上面的代码段得到了第二分钟...试试这个.....
添加回答
举报