情景:对于一个数组,同时求出其最大值和最小值。
分析:
方法1: 将最大值和最小值设置为第一个元素,依次比较剩下的元素,需要比较 2 (n - 1) 次; 方法2 主要思路为成对比较。 取出相邻两个元素,比较大小,然后将较小值和最小值比较,将较大值和最大值比较,如此一对元素需要进行三次比较。 最大值和最小值的初始化和数组长度奇偶相关:如果数组长度为奇数,将最大值和最小值设置为第一个元素,然后从第二个元素起,成对的进行比较; 如果数组长度为偶数,首先对第一对元素进行比较,将最大值初始化为较大值,最小值初始化为较小值,然后从第三个元素起,成对的进行比较。 代码: import java.util.ArrayList; public class MaxAndMinDemo { public static int bruteForce(ArrayList<Integer> list) { int maxVal = list.get(0); int minVal = list.get(0); int times = 0; for (int i = 1; i < list.size(); i++) { if (list.get(i) >= maxVal) { maxVal = list.get(i); times++; } else { times++; } if (list.get(i) <= minVal) { minVal = list.get(i); times++; } else { times++; } } return times; } public static int mathod(ArrayList<Integer> list) { int maxVal = 0; int minVal = 0; int times = 0; if (list.size() % 2 == 0) { if (list.get(0) > list.get(1) ) { maxVal = list.get(0); minVal = list.get(1); } else { maxVal = list.get(1); minVal = list.get(0); } times++; for (int i = 2; i < list.size() - 1; i = i + 2) { if (list.get(i) > list.get(i + 1)) { maxVal = Math.max(maxVal, list.get(i)); times++; minVal = Math.min(minVal, list.get(i + 1)); times++; } else { maxVal = Math.max(maxVal, list.get(i + 1)); times++; minVal = Math.min(minVal, list.get(i)); times++; } times++; } } else { maxVal = list.get(0); minVal = list.get(0); for (int i = 1; i < list.size() - 1; i = i + 2) { if (list.get(i) > list.get(i + 1)) { maxVal = Math.max(maxVal, list.get(i)); times++; minVal = Math.min(minVal, list.get(i + 1)); times++; } else { maxVal = Math.max(maxVal, list.get(i + 1)); times++; minVal = Math.min(minVal, list.get(i)); times++; } times++; } } return times; } public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Integer> list = new ArrayList<Integer>(); for (int j = 100001; j > 0; j--) { list.add(j); } System.out.println(bruteForce(list)); System.out.println(mathod(list)); } } 结果: 200000 150000
利用方法二,可以减少四分之一的比较次数,很屌。。。