您的位置:首页 > 其它

动态规划系列---求数组中两个元素差的最大值

2017-10-11 00:56 316 查看

题目

求数组中两个元素差的最大值(后面的元素减去前面的元素);对应实际生活中的股票买卖,找出一只股票走势里面可能的最大收益;

思路

类似于求数组连续和的最大值; 保存最大差值和最小值,遍历数组,如果当前元素-min>最大差值,则更新最大差值;如果当前元素<最小值,则更新最小值;

实现

public static int max_difference(int[] a){
int len=a.length;
if(len<2){
return 0;
}
int min=Math.min(a[0], a[1]);
int max_diff=a[1]-a[0];
for(int i=2;i<len;i++){
if(a[i]-min>max_diff){
max_diff=a[i]-min;
}
if(a[i]<min){
min=a[i];
}
}
return max_diff;
}
c版本:
一个整数数组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;}123456789101112131415
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐