数组中元素差的最大值
2015-09-12 15:11
274 查看
这道题是2016美团面试题:
1.给定一个数组arr,数组长度为len,求满足 0 <= a <= b < len的 arr - arr[a]最大值。
你的想法:让每一个数字减去它右边的数字,并通过比较得到数对的最大值,时间复杂度(O^2),这应该是面试官不想要的。
[b]解法一:分治法(递归实现)
假设把数组分成两个子数组,用左数组最大的减去右数组最小的,最大值有三种情况:
(1)被减数和减数都在第一个子数组中,即第一个子数组中的数对之差的最大值;
(2)被减数和减数都在第二个子数组中,即第二个子数组中数对之差的最大值;
(3)被减数在第一个子数组中,是第一个子数组的最大值;减数在第二个子数组中,是第二个子数组的最小值。
(1)、(2)、(3)中,这三个差值的最大者就是整个数组中数对之差的最大值。
View Code
以上三种都是O(n),那么:
第一种:递归,有递归栈
第二种:要n-1辅助数组
第三种:推荐
1.给定一个数组arr,数组长度为len,求满足 0 <= a <= b < len的 arr - arr[a]最大值。
你的想法:让每一个数字减去它右边的数字,并通过比较得到数对的最大值,时间复杂度(O^2),这应该是面试官不想要的。
[b]解法一:分治法(递归实现)
假设把数组分成两个子数组,用左数组最大的减去右数组最小的,最大值有三种情况:
(1)被减数和减数都在第一个子数组中,即第一个子数组中的数对之差的最大值;
(2)被减数和减数都在第二个子数组中,即第二个子数组中数对之差的最大值;
(3)被减数在第一个子数组中,是第一个子数组的最大值;减数在第二个子数组中,是第二个子数组的最小值。
(1)、(2)、(3)中,这三个差值的最大者就是整个数组中数对之差的最大值。
#include <iostream> #include <stack> #include <algorithm> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; int max_find(int arr[],int len) { if(arr == NULL || len < 2) { return -1; } int max = arr[0]; int sum = max - arr[1];//初始化数对差 int i = 0; for(i = 2;i < len;++i) { if(arr[i-1] > max) { max = arr[i-1]; //左侧最大值 } int cur = max - arr[i];//用最大的值减右侧的最小值 if(cur > sum) //判断是否是最大数对之差 { sum = cur; } } printf("%d",sum); } int main() { int a[2] = {10,5}; max_find(a,2); }
View Code
以上三种都是O(n),那么:
第一种:递归,有递归栈
第二种:要n-1辅助数组
第三种:推荐
相关文章推荐
- 回文树
- 最长的可整合子数组的长度
- 【C#】初识c#
- CSS学习笔记----CSS3自定义字体图标
- MySql学习之varchar类型
- RadioButton的两种显示方式
- mysql优化篇(三)
- 堆排序和选择排序的比较
- 前台通过get请求后台中文乱码!
- No compiler is provided in this environment. Perhaps you are running on a JRE
- python unittest源码解析四----关于源码中的__unittest的用处
- windows server 2008见安装IIS方法(解决)
- 类簇
- 创建实体数据模型(EF基础系列5)
- 【项目三之经典问题——汉诺塔】
- 最小二乘法的几何解释
- [Wed, 19 Aug 2015 ~ Tue, 25 Aug 2015] Deep Learning in arxiv
- intel ipp6.0安装过程
- 堆排序
- Iterator和ListIterator