设计一个更优算法查找一n个元素数组中的最大值和最小值

题目如题,已知一种需要比较2n次的方法,要求给出一个更优的算法。特别注意优化时间复杂度的常数!

解题思路:原始的方法在遍历数组的时候,每个数组元素都要和Max与Min比较,共比较2n次;可以通过将数组两两分组,用每个分组的最大值与Max进行比较,最小值与Min进行比较来进行优化,这样一来比较次数减少为3n/2。

代码实现如下:

#include <iostream>
#include "limits.h"

using namespace std;

int main() {
	int d[] = {9, 6, 7, 5, 13, 6, 2};
	int n = 8;
	int max = INT_MIN;
	int min = INT_MAX;
	bool flag = false;
	if(n % 2) {
		n--;
		flag = true;		
	}
		
	for(int i = 0; i < n-1; i+=2) {
		if(d[i] <= d[i+1]) {
			if(d[i] < min)
				min = d[i];
			if(d[i+1] > max)
				max = d[i+1];
		}
		else {
			if(d[i] > max)
				max = d[i];
			if(d[i+1] < min)
				min = d[i+1];
		}	
	}
	//若数组长度为奇数,还需要和最后一个数作比较 
	if(flag) {
		if(d[n] < min)
			min = d[n];
		if(d[n] > max)
			max = d[n];	
	}
	cout << "The max value of the array is: " << max << endl;
	cout << "The min value of the array is: " << min << endl;	
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值