动态规划系列---求数组中两个元素差的最大值
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
相关文章推荐
- 每天学习一算法系列(5)(已知两个数组,数组里的元素有正有负,但是都是按照从小到大已经排好序,要求用尽可能小的时间复杂度编写一算法求出两个数组的最大交集)
- 每天学习一算法系列(5)(已知两个数组,数组里的元素有正有负,但是都是按照从小到大已经排好序,要求用尽可能小的时间复杂度编写一算法求出两个数组的最大交集)
- 动态规划系列---求数组中两个元素差的最大值
- 动态规划问题系列---连续子数组(二维)的最大和
- 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值
- 数组内两个元素的最大差
- 给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组 最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上
- 动态规划典型例题--连续子数组的最大和
- 说你有一个数组,其中第i个元素是第i天给定股票的价格。设计一个算法来找到最大的利润,最多可以完成两个交易。
- 动态规划经典题:给出两个字符串s1和s2,返回其中最大的公共子串
- 动态规划-循环数组的最大子数组和
- 任意给定一整数数组,求两个元素之差的最大值和数组中出现次数最多的数
- 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值
- 动态规划求取连续数组最大和
- 动态规划——数组最大子数组和
- 求数组中两个元素差的最大值
- 【面试常见题目之动态规划】连续子序列的最大和(子数组的最大和)
- Leetcode421. 找出数组中两个元素异或的最大值
- 利用动态规划和递归分别求两个串的最大公共子序列
- 动态规划求不相邻的最大子数组和