人一旦悟透了就会变得沉默,不是没有与人相处的能力,而是没有了逢人作戏的兴趣.
解决这些问题如果需要对数组进行排序,那不好意思...
1. 求数组的最大值
public int getMax(int[] array) {
// 注意这里,求最大值时,将初始值设置为Integer.MIN_VALUE
int max = Integer.MIN_VALUE;
for(int n : array){
max = Math.max(max,n);
}
return max;
}
2. 求数组的最小值
public int getMin(int[] array){
// 注意这里,求最小值时,将初始值设置为Integer.MAX_VALUE
int min = Integer.MAX_VALUE;
for(int n : array){
min = Math.min(min,n);
}
return min;
}
3. 求数组的次小值(重点)
最小值和次小值虽然只有一字之差,但是"差之毫厘,谬之千里"啊。
这里的前提是不排序
1. 两次循环:时间复杂度O(n)
public static int finSecMin(int[] nums){
int min = Integer.MAX_VALUE;
int secMin = Integer.MAX_VALUE;
for(int i = 0; i < nums.length; i++){
min = Math.min(nums[i], min);
}
System.out.println("最小值:"+min);
for (int i = 0; i < nums.length; i++) {
if(nums[i] > min){
secMin = Math.min(nums[i],secMin);
}
}
System.out.println("次最小值:"+secMin);
return secMin;
}
还有更好的方案吗?答案是肯定的。
2. 最优解:时间复杂度O(n)
经过一次for循环,就可以得到最小值和次小值
public static int finSecMin(int[] nums){
int min = Integer.MAX_VALUE;
int secMin = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
if(nums[i] < min){
secMin = min;
min = nums[i];
}else if(nums[i] < secMin){
secMin = nums[i];
}
}
System.out.println("最小值:"+min+",次最小值:"+secMin);
return secMin;
}
这里对这些 经典的解法(不排序) 进行总结,相信这些小工具在你刷题的道路上能给你带来很多帮助...