求无序数组的(max+min)最大的子数组------为学论坛上面的一道面试题
2013-03-04 16:57
232 查看
原题目链接:http://www.51weixue.com/thread-398-1-1.html
题目:
杭州某公司的面试题,哪家可自己猜,不方便说;算是其中挺难的题了,当场能做出来的极少;出出来为论坛增点人气!
求无序数组的(max+min)最大的子数组
题目意思就是,给出一个无序的数组,均为正数,要找一个子数组,使得该子数组内的最小值加上最大值能取到最大。
例子: 3 9 2 7 1 5 8
能取到的(max+min)最大的子数组为(5,8)。
-------------------------------分割线------------------------
粗略一看,能够想出时间复杂度为O(n^2)的算法并不难,无非就是遍历所有子数组,并找出其中最小值+最大值为最大的那个。但是能不能够找到时间复杂度为O(n)的算法呢?
刚开始想的时候,自己还真没有想到有什么简便的方法,老是往一种复杂的地方去想。其实只要写多几组示例数据就能够找出其中的规律。
例如:
示例一:3 9 2 7 1 5 8,最大为(5,8),
示例二:6 5 10 9 4 11,最大为(10,9)
示例三:4 7 3 7 9 2 7 ,最大为(7,9)
示例四:4 9 10 5 11 4 7 9,最大为(9,10)
------------------------------
看出其中的规律没?有没有发现其中最大的子数组都是由两个元素组成的?既然这样,我就先YY这个符合条件的子数组必然是由两个元素组成的。那么去推敲一下。
首先,一开始有两个元素,其中一个为最大值,一个为最小值。然后引入第三个元素,如果这第三个元素比刚才那两个更大,那么我们可以建立一个新的符合条件的子数组。比如示例二中一开始子数组为(6,5),最大值为6,最小值为5,引入第三个元素10后,则符合条件最大的子数组变为(5,10)。同样道理,当引第三个元素比刚才那两个元素都更小时我们,则最大的子数组由刚才那两个元素组成。比如示例三中,(4,7,3).
那么,根据这个规律,我们便可以很轻松地写出一个时间复杂度为O(n)的算法。
代码实现:
题目:
杭州某公司的面试题,哪家可自己猜,不方便说;算是其中挺难的题了,当场能做出来的极少;出出来为论坛增点人气!
求无序数组的(max+min)最大的子数组
题目意思就是,给出一个无序的数组,均为正数,要找一个子数组,使得该子数组内的最小值加上最大值能取到最大。
例子: 3 9 2 7 1 5 8
能取到的(max+min)最大的子数组为(5,8)。
-------------------------------分割线------------------------
粗略一看,能够想出时间复杂度为O(n^2)的算法并不难,无非就是遍历所有子数组,并找出其中最小值+最大值为最大的那个。但是能不能够找到时间复杂度为O(n)的算法呢?
刚开始想的时候,自己还真没有想到有什么简便的方法,老是往一种复杂的地方去想。其实只要写多几组示例数据就能够找出其中的规律。
例如:
示例一:3 9 2 7 1 5 8,最大为(5,8),
示例二:6 5 10 9 4 11,最大为(10,9)
示例三:4 7 3 7 9 2 7 ,最大为(7,9)
示例四:4 9 10 5 11 4 7 9,最大为(9,10)
------------------------------
看出其中的规律没?有没有发现其中最大的子数组都是由两个元素组成的?既然这样,我就先YY这个符合条件的子数组必然是由两个元素组成的。那么去推敲一下。
首先,一开始有两个元素,其中一个为最大值,一个为最小值。然后引入第三个元素,如果这第三个元素比刚才那两个更大,那么我们可以建立一个新的符合条件的子数组。比如示例二中一开始子数组为(6,5),最大值为6,最小值为5,引入第三个元素10后,则符合条件最大的子数组变为(5,10)。同样道理,当引第三个元素比刚才那两个元素都更小时我们,则最大的子数组由刚才那两个元素组成。比如示例三中,(4,7,3).
那么,根据这个规律,我们便可以很轻松地写出一个时间复杂度为O(n)的算法。
代码实现:
#include<stdio.h> const int N = 100 ; int A ; int FindMaxSum(int *ptrA,int n) ; int main(void) { int i,n ; freopen("in.txt","r",stdin) ; while(scanf("%d",&n) != EOF) { for(i = 0 ; i < n ; ++i) { scanf("%d",&A[i]) ; } printf("%d\n",FindMaxSum(A,n)) ; } return 0 ; } int FindMaxSum(int *ptrA,int n) { int i,nTemp,nMaxSum = 0 ; for(i = 0 ; i < n ; ++i) { if(i+1 < n) { nTemp = ptrA[i] + ptrA[i+1] ; if(nTemp > nMaxSum) { nMaxSum = nTemp ; } } } if(1 == n) //对应数组元素只有一个的情况 { nMaxSum = ptrA[0] ; } return nMaxSum ; }
相关文章推荐
- 求无序数组中(max+min)最大的子数组
- js数组最大值max和最小值min
- 在德问上面看到的一道面试题:交换数字位置得到相对最大值
- 一道面试题,对一个数组进行排序,第一个最大,第二个最小,第三个次大,一次类推
- 2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]
- 面试题8:无序数组的最大差值
- 一道面试题:对一个数组进行排序,要求第一个最大、第二
- (google面试题)找出无序数组中连接和最大排序
- 实验九指针1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 实验9 指针1 、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依
- 一道面试题: C能申请的最大全局数组大小?
- 求子数组的最大和问题--一道浙江大学考研压轴题(被Google拿来做面试题)
- 实验9 指针1 1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- BAT面试题 - 找一个无序实数数组中的最大差值
- 数组之求无序数组中的min和max
- 求无序数组的(max+min)最大的子数组
- 实验9(1)程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java
- java快速寻找一个数组的最大值或最小值, min, max,三种方法
- 一道很火的面试题:求子数组的最大和