寻找一个数组中的最大和最小数
2017-02-16 18:57
591 查看
工作一段快两年了,感觉之前学的数据结构和算法基本忘得差不多了,最近一段时间准备复习一下相关知识。
有一个求数组中最大和最小数的题目,基本的思路是遍历一遍数组,然后每个一个元素都和最大值和最小值比较,时间复杂度是2(N-1)或2N。
比较简单的一种减少复杂度的方法是把数组的元素两两分组比较,然后较大的数和max比较,较小的数和min比较,这种实现方法的时间复杂度是1.5N。
还有一种是采用分治法,比较次数也是1.5N,思路是将数组一分为二,分别获取两个子数组的最大和最小值,然后进行取两个子数组中较小的最小值和较大的最大值。
O(N) = (N/2 + N/4 + … + N/2^(log2(N))) = 3N/2 ?
欢迎点击
有一个求数组中最大和最小数的题目,基本的思路是遍历一遍数组,然后每个一个元素都和最大值和最小值比较,时间复杂度是2(N-1)或2N。
比较简单的一种减少复杂度的方法是把数组的元素两两分组比较,然后较大的数和max比较,较小的数和min比较,这种实现方法的时间复杂度是1.5N。
还有一种是采用分治法,比较次数也是1.5N,思路是将数组一分为二,分别获取两个子数组的最大和最小值,然后进行取两个子数组中较小的最小值和较大的最大值。
O(N) = (N/2 + N/4 + … + N/2^(log2(N))) = 3N/2 ?
#include <cstdio> void max_min(int a[], int begin, int end, int *max, int *min) { if (end == begin) { *max = a[begin]; *min = a[end]; return; } int l_max, r_max; int l_min, r_min; max_min(a, begin, begin + (end - begin) / 2, &l_max, &l_min); max_min(a, begin + (end - begin) / 2 + 1, end, &r_max, &r_min); *max = l_max > r_max ? l_max : r_max; *min = l_min < r_min ? l_min : r_min; } int main() { int array[] = {5,7,8,9,11,13,45,8,9,23,45,97,3,2,7,14,64}; int len = sizeof(array) / sizeof(int); int max = array[0]; int min = array[0]; for (int i = 1; i < len; ++i) { if (array[i] > max) { max = array[i]; } else if (array[i] < min){ min = array[i]; } } printf("max:%d min:%d\", max, min); int start = -1; if (len & 0x1) { start = 1; } else { start = 0; } for (int i = start; i < len; i+=2) { if (array[i] > array[i + 1]) { if (array[i] > max) max = array[i]; if (array[i + 1] < min) min = array[i + 1]; } else if (array[i] < array[i + 1]) { if (array[i] < min) min = array[i]; if (array[i + 1] > max) max = array[i + 1]; } } printf("max:%d min:%d\", max, min); max_min(array, 0, len - 1, &max, &min); printf("max:%d min:%d\", max, min); return 0; }
欢迎点击
相关文章推荐
- java快速寻找一个数组的最大值或最小值, min, max,三种方法
- 同时寻找一个数组中的最大元素和最小元素--你会有所收获
- 寻找在数组中一个元素是不是该行最小,该列最大的元素
- 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。
- 寻找数组中的最大值和最小值
- 2.10 寻找数组中的最大值和最小值
- 用递归法求解一个数组中的最大值和最小值的问题
- 【编程之美】读书笔记:寻找数组中的最大值和最小值
- 一个数组中同时找到最大/最小值
- 编程之美寻找数组中的最大值和最小值以及扩展问题
- 在数组中,寻找一个最大递增子数列
- 编程之美_2.10_寻找数组中的最大值和最小值
- 寻找数组中最大值和最小值
- 编写一个函数 返回数组中最大值与最小值的差值
- 寻找数组中最大值和最小值
- 寻找数组中的最大值和最小值(编程之美2.10)
- 初始化一个有10个整数的数组,在数组中查找并输出最大值和最小值。
- 编程之美-2.10-寻找数组中的最大值和最小值
- 寻找数组中的最小值和最大值——编程之美2.10
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。