数组的最值问题

417 阅读1分钟

人一旦悟透了就会变得沉默,不是没有与人相处的能力,而是没有了逢人作戏的兴趣.


解决这些问题如果需要对数组进行排序,那不好意思...

在这里插入图片描述


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;
    }

练习地址:LintCode - 2176 · 求数组最大值


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;
    }

这里对这些 经典的解法(不排序) 进行总结,相信这些小工具在你刷题的道路上能给你带来很多帮助...