求一个数组中两个元素的最大差值
2013-09-28 20:52
323 查看
一个整数数组a
,在a
中找两个数字,使得下标大的数字减去下表小的数字所得的差值最大,即:
在a
中找 a[i] 和 a[j] ,使得 a[i] - a[j] 的值最大,并且 i > j 。 题目来自这里。
寻求O(n)的解法,思路:
记录已经遍历的元素中的最小值min和当前所求的最大差值r,然后继续遍历下一个元素。
首先和当前最小值min求差,如果比r大,则更新r。
其次,跟当前最小值min比较,如果小于min,则更新min。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[]={-1, -2, -3, -1};
int n = sizeof(a) / sizeof(a[0]);
int min, r; // min当前最小值, r最终要求的结果
int i;
min = a[0] < a[1] ? a[0] : a[1];
r = a[1] - a[0];
for (i = 2; i < n; i++)
{
if (a[i] - min > r)
r = a[i] - min;
if (a[i] < min)
min = a[i];
}
printf("%d\n", r);
return 0;
}
之前在面试的时候碰到一道题,要求找出一个互异数组中两个元素的最大差值。具体描述如下:
有一个整数数组d[0,...,n-1],并且数组满足不存在相同的元素,要求找出
1) max{d[i] - d[j]} 且 i > j;(对应实际生活中的股票买卖,找出可能的最大收益)
2) max{d[i] - d[j]} 且 i < j。
思路有很多种,用动态规划最简单,时间复杂度都是O(n),线性时间复杂度。以下为代码:
#define DEBUG
#include <cstdio>
#include <cstdlib>
using namespace std;
inline int min(int a, int b)
{
return a < b ? a : b;
}
intfindMaxDiff1(int n, int*
d)
{
int i = 0;
int minLeft = d[0];
int maxDiff = d[1] - d[0];
for(i = 2; i < n; i++)
{
if(d[i - 1] < minLeft)
{
minLeft = d[i - 1];
}
if(d[i] - minLeft > maxDiff)
{
maxDiff = d[i] - minLeft;
}
}
return maxDiff;
}
intfindMaxDiff2(int n, int*
d)
{
int i = 0;
int maxLeft = d[0];
int maxDiff = d[0] - d[1];
for(i = 2; i < n; i++)
{
if(d[i - 1] > maxLeft)
{
maxLeft = d[i - 1];
}
if(maxLeft - d[i] > maxDiff)
{
maxDiff = maxLeft - d[i];
}
}
return maxDiff;
}
int main()
{
#ifndef DEBUG
int n = 0, i = 0;
int* d = NULL;
printf("please input the length of array:");
scanf("%d", &n);
d = (int*)malloc(sizeof(int)
* n);
printf("please input the elements of array:");
for(i = 0; i < n; i++)
{
scanf("%d", &d[i]);
}
#else
int n = 8;
int d[8] = {12, 4, 23, 1, 2, 5, 7, 10};
#endif
int d1 = findMaxDiff1(n, d);
int d2 = findMaxDiff2(n, d);
#ifndef DEBUG
free(d);
#endif
return 0;
}
,在a
中找两个数字,使得下标大的数字减去下表小的数字所得的差值最大,即:
在a
中找 a[i] 和 a[j] ,使得 a[i] - a[j] 的值最大,并且 i > j 。 题目来自这里。
寻求O(n)的解法,思路:
记录已经遍历的元素中的最小值min和当前所求的最大差值r,然后继续遍历下一个元素。
首先和当前最小值min求差,如果比r大,则更新r。
其次,跟当前最小值min比较,如果小于min,则更新min。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[]={-1, -2, -3, -1};
int n = sizeof(a) / sizeof(a[0]);
int min, r; // min当前最小值, r最终要求的结果
int i;
min = a[0] < a[1] ? a[0] : a[1];
r = a[1] - a[0];
for (i = 2; i < n; i++)
{
if (a[i] - min > r)
r = a[i] - min;
if (a[i] < min)
min = a[i];
}
printf("%d\n", r);
return 0;
}
之前在面试的时候碰到一道题,要求找出一个互异数组中两个元素的最大差值。具体描述如下:
有一个整数数组d[0,...,n-1],并且数组满足不存在相同的元素,要求找出
1) max{d[i] - d[j]} 且 i > j;(对应实际生活中的股票买卖,找出可能的最大收益)
2) max{d[i] - d[j]} 且 i < j。
思路有很多种,用动态规划最简单,时间复杂度都是O(n),线性时间复杂度。以下为代码:
#define DEBUG
#include <cstdio>
#include <cstdlib>
using namespace std;
inline int min(int a, int b)
{
return a < b ? a : b;
}
intfindMaxDiff1(int n, int*
d)
{
int i = 0;
int minLeft = d[0];
int maxDiff = d[1] - d[0];
for(i = 2; i < n; i++)
{
if(d[i - 1] < minLeft)
{
minLeft = d[i - 1];
}
if(d[i] - minLeft > maxDiff)
{
maxDiff = d[i] - minLeft;
}
}
return maxDiff;
}
intfindMaxDiff2(int n, int*
d)
{
int i = 0;
int maxLeft = d[0];
int maxDiff = d[0] - d[1];
for(i = 2; i < n; i++)
{
if(d[i - 1] > maxLeft)
{
maxLeft = d[i - 1];
}
if(maxLeft - d[i] > maxDiff)
{
maxDiff = maxLeft - d[i];
}
}
return maxDiff;
}
int main()
{
#ifndef DEBUG
int n = 0, i = 0;
int* d = NULL;
printf("please input the length of array:");
scanf("%d", &n);
d = (int*)malloc(sizeof(int)
* n);
printf("please input the elements of array:");
for(i = 0; i < n; i++)
{
scanf("%d", &d[i]);
}
#else
int n = 8;
int d[8] = {12, 4, 23, 1, 2, 5, 7, 10};
#endif
int d1 = findMaxDiff1(n, d);
int d2 = findMaxDiff2(n, d);
#ifndef DEBUG
free(d);
#endif
return 0;
}
相关文章推荐
- 【转】博弈知识汇总
- RS232电平 RS485电平 RS422电平
- T-SQL 随机返回特定行数据和分页查询
- LPC1768 UART0
- UVA 10816 Travel in Desert 最短路+二分
- UVA 10816 Travel in Desert 最短路+二分
- hdu 1846 博弈
- 最短路径
- 优秀员工的十二种品质 - 马云在上海演讲说的话
- Cut the Cake(大数相乘)
- Session、Application、Cache
- oracle创建表空间、创建用户
- 分享MYSQL插入数据时忽略重复数据的方法
- HDU 4767 Bell (中国剩余定理)
- 查找大于一正整数的最小的不重复数
- java精确的加减乘除
- Linux 系统信息查询命令
- 单链表的逆转
- 使用axis2解析wsdl反向生成webservice客户端
- Lammps 金刚石弹性模量的计算