题目:一个数组,找一个数对,使得两个数对之差最大,并且较大数在较小数之前,要求时间复杂度为O(n)
解决方法:
动态规划,额外定义两个数组,temp[]、max[]
temp[i]用来存储,从开始到下标为i的元素位置,最大数对之差
max[i]用来存储,从开始到下标为i的元素位置,最大值
i=0时:
temp[i]=0;
max[i]=A[i];
i!=0时:
temp[i+1]=max{temp[i],max[i]-A[i+1]};
max[i+1]=max{max[i],A[i+1]};
实现代码如下:
- public class Test{
- public static int []temp;
- public static int []max;
- public static void main(String []args){
- int []A ={1,2,-1,6,8,3,5,2,6};
- temp=new int [A.length];
- max=new int [A.length];
- System.out.println(find(A));
- }
- public static int find(int []A){
- int i;
- for(i=0;i<A.length;i++){
- if(i==0){
- temp[i]=0;
- max[i]=A[i];
- }else{
- temp[i]=maxtwo(temp[i-1],max[i-1]-A[i]);
- max[i]=maxtwo(max[i-1],A[i]);
- }
- }
- return temp[i-1];
- }
- public static int maxtwo(int a,int b){//返回二者最大值
- if(a>b){
- return a;
- }else{
- return b;
- }
- }
- }
时间复杂度为:O(n)
空间复杂度为:O(n)
转载:https://blog.csdn.net/abbcbbd/article/details/51464699