算法导论9.1 最大值和最小值

情景:对于一个数组,同时求出其最大值和最小值。

分析:

  • 方法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


利用方法二,可以减少四分之一的比较次数,很屌。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值