一个数组a[0...n-1],求a[i]-a[j]的最大值,其中i>j
2009-12-02 10:44
459 查看
其实这道题有O(n)的方法。
第一种方法:
左往右求下标1到 k - 1 的最大值MAX
右往左求 下标k到n -1 的最小值MIN
对于每个k都有一个MAX - MIN的值,最后求这个值的最大值即可。
比如4 5 2 6 3 1
MAX 4 4 2 2 2
MIN 1 3 6 6 6
左上减去右下,最大的值为6 - 2 = 4, 即为结果
第二种方法:
令b[i] = a[i + 1] - a[i],那么a[i] - a[j] = b[j] + ... b[i - 1],即将问题转化成求一个数组子序列的最大值。这个过程的算法是有O(n)的算法的。
具体的见: http://eliteworks.spaces.live.com/blog/cns!4D58C57B1D952D41!187.entry
第一种方法:
左往右求下标1到 k - 1 的最大值MAX
右往左求 下标k到n -1 的最小值MIN
对于每个k都有一个MAX - MIN的值,最后求这个值的最大值即可。
比如4 5 2 6 3 1
MAX 4 4 2 2 2
MIN 1 3 6 6 6
左上减去右下,最大的值为6 - 2 = 4, 即为结果
第二种方法:
令b[i] = a[i + 1] - a[i],那么a[i] - a[j] = b[j] + ... b[i - 1],即将问题转化成求一个数组子序列的最大值。这个过程的算法是有O(n)的算法的。
具体的见: http://eliteworks.spaces.live.com/blog/cns!4D58C57B1D952D41!187.entry
相关文章推荐
- 说你有一个数组,其中第i个元素是第i天给定股票的价格。设计一个算法来找到最大的利润,最多可以完成两个交易。
- [360面试题2018]:一个数组a[0...n-1],求a[j]-a[i]的最大值+求a[i]-a[j]的最大值,其中i<j
- 每日一题 一个整型数组,其中有正值有负值,请拿出其中相邻子数组中的最大值
- //设计一个函数模板 max <T>求一个数组中最大的元素,并以整数数组和字符数 //组进行调用。
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- 一个数组a[0...n-1],求a[j]-a[i]的最大值,其中i<j
- 一个无序整数数组,数组元素大于5个,请用一种高效的算法找出其中最大的5个值.
- 在一个有8个整数(18,25,7,36,13,2,89,63)的数组中找出其中最大的数及其下标。
- 10.2 设计一个函数模板 max <T>求一个数组中最大的元素,并以整数数组和字符数 组进行调用
- 给一个数组[a1,a2,a3....an],要求出令ai-aj有最大值,其中i<=j,时间和空间复杂度尽可能小
- 数组中的最大递增子序列(Longest Increasing Subsequence<LIS>)
- 一个整数数组(正负,0),找出这个数组的最大子序列
- 01背包(求前一个的最大价值-->求前K个的最大价值) 之 hdu 2639
- 返回一个二维整数数组中最大联通子数组的和
- 编写一个计算一维数组中所有整数的最大公约数的函数
- 给定一个无序的整型数组arr,找到其中最小的k个数。
- 返回一个二维循环数组中最大子矩阵的和
- 返回一个二维整数数组中最大子数组的和。
- 每日一个小算法(一) 数组中连续个数组成的和最大
- 求一个整数数组的最大元素,用递归方法实现