1、寻找数组中的最大值和最小值


public class Pair {
	private int max;
	private int min;

	public Pair(int max, int min) {
		this.max = max;
		this.min = min;
	}

	public int getMax() {
		return max;
	}

	public void setMax(int max) {
		this.max = max;
	}

	public int getMin() {
		return min;
	}

	public void setMin(int min) {
		this.min = min;
	}
	public void print() {
		System.out.println("[" + this.max + "," + this.min + "]");
	}
	
}
public class SearchMinAndMaxFormArray {
	//方法1:遍历两次数组,分别找出最大值和最小值。需要进行 2 * N 次比较
	public static Pair function1(int[] arr) {
		int max = arr[0] > arr[1] ? arr[0]:arr[1];
		int min = arr[0] < arr[1] ? arr[0]:arr[1];
		
		//开始循环查找
		for(int i = 2; i < arr.length; i ++) {
			if(arr[i] < min) {
				min = arr[i];
			}
			if(arr[i] > max) {
				max = arr[i];
			}
		}
		Pair pair = new Pair(max, min);
		
		return pair;
		
		
	}
	
	//方法2:分组
	public static Pair function2(int[] arr) {
		Pair pair = null;
		int max = 0;
		int min = 0;
		
		if(arr.length % 2 == 0) {
			
			//计算分组,取整
			int pairSum = arr.length / 2; 
			
			//使用第一个分组初始化max & min
			max = arr[0] > arr[1] ? arr[0]:arr[1];
			min = arr[0] < arr[1] ? arr[0]:arr[1];
			
			//遍历分组数
			int tempMax = Integer.MAX_VALUE;
			int tempMin = Integer.MAX_VALUE;
			for(int i = 2; i <= pairSum; i ++) {
				//得到每个分组中的最大值和最小值
				tempMax = arr[2 * i - 2] > arr[2 * i - 1] ? arr[2 * i - 2]:arr[2 * i - 1];
				tempMin = arr[2 * i - 2] < arr[2 * i - 1] ? arr[2 * i - 2]:arr[2 * i - 1];
				
				//更新整个数组中的最大值和最小值
				if(tempMax > max) {
					max = tempMax;
				}
				if(tempMin < min) {
					min = tempMin;
				}
			}
			
		} else {
			max = max > arr[arr.length - 1] ? max : arr[arr.length - 1];
			min = min < arr[arr.length - 1] ? min : arr[arr.length - 1];
			
		}
		pair = new Pair(max, min);
		
		return pair;
	}
	
	//方法3:分制
	public static Pair function3(int[] arr, int begin, int end) {
		Pair pair = null;
		int max = 0;
		int min = 0;
		if(begin + 1 >= end) {
			max = arr[begin] > arr[end] ? arr[begin]:arr[end];
			min = arr[begin] < arr[end] ? arr[begin]:arr[end];
		} else {
			int middle = (begin + end + 1) / 2;
			Pair left = function3(arr, begin, middle);
			Pair right = function3(arr, middle + 1, end);
			
			max = left.getMax() > right.getMax() ? left.getMax():right.getMax();
			min = left.getMin() < right.getMin() ? left.getMin():right.getMin();
		}
		pair = new Pair(max, min);
		
		return pair;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] arr =  {2, 3, 1, 5, 6,  9, 7, 8};
		SearchMinAndMaxFormArray.function1(arr).print();
		System.out.println("====================");
		SearchMinAndMaxFormArray.function2(arr).print();
		System.out.println("====================");
		SearchMinAndMaxFormArray.function3(arr, 0 , arr.length - 1).print();
		

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值