目录
Floyd算法 动态规划算法
Floyd在1962年由Robert Floyd以其当前公认的形式出版。算法作为三个嵌套for循环的现代公式首先由Peter Ingerman在1962年描述。Floyd 算法是解决图论问题的比较经典的算法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图的最短路径问题。
Floyd算法是一种动态规划算法,节点间的连接权值可正可负。此算法简单有效,在稠密地图中效果最佳。由于三重循环结构紧凑,在稠密图中效率要高于Dijkstra算法。
Floyd 算法优点主要体现在 ① 算法简单,容易理解,且代码编写简单。②可以算出任意两个节点之间的最短距离,这是很多路径规划算法所不具有的优势。
Floyd 算法缺点主要体现在∶时间复杂度比较高,对于稀疏图将会生成稀疏矩阵,极大浪费了储存空间。
原文链接:https://blog.csdn.net/qq_44339029/article/details/127043021
Floyd (弗洛伊德)算法简述_弗洛伊德算法-CSDN博客
动态规划系列---求数组中两个元素差的最大值
题目
求数组中两个元素差的最大值(后面的元素减去前面的元素);对应实际生活中的股票买卖,找出一只股票走势里面可能的最大收益;
类似于求数组连续和的最大值;
保存最大差值和最小值,遍历数组,如果当前元素-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[n],在a[n]中找两个数字,使得下标大的数字减去下表小的数字所得的差值最大,即:
在a[n]中找 a[i] 和 a[j] ,使得 a[i] - a[j] 的值最大,并且 i > j 。 题目来自这里。
寻求O(n)的解法,思路:
#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;
}
记录已经遍历的元素中的最小值min和当前所求的最大差值r,然后继续遍历下一个元素。
首先和当前最小值min求差,如果比r大,则更新r。
其次,跟当前最小值min比较,如果小于min,则更新min。