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;
}
我從上面的代碼段得到了第二分鐘...試試這個.....
添加回答
舉報