数组单调和

来源:互联网 发布:南方数据粘贴 编辑:程序博客网 时间:2024/05/15 11:43

现定义数组单调和为所有元素i的f(i)值之和。这里的f(i)函数定义为元素i左边(不包括其自身)小于等于它的数字之和。请设计一个高效算法,计算数组的单调和。

给定一个数组A同时给定数组的大小n,请返回数组的单调和。保证数组大小小于等于500,同时保证单调和不会超过int范围。

测试样例:
[1,3,5,2,4,6],6
返回:27
class MonoSum {public:    int res=0;    int calcMonoSum(vector<int> A, int n) {        // write code here        int len=A.size()-1;        MergeSort(A,0,len);        return res;    }    void MergeSort(vector<int> &A,int start,int end){        if(start<end){            int mid=(start+end)/2;            MergeSort(A,start,mid);            MergeSort(A,mid+1,end);            Merge(A,start,mid,end);        }    }    void Merge(vector<int>&A,int start,int mid,int end ){        vector<int> tmp(A.size(),0);        for(int i=0;i<A.size();i++){            tmp[i]=A[i];        }        int i,j,k;        for(i=start,j=mid+1,k=start;i<=mid&&j<=end;k++){            if(tmp[i]<=tmp[j]){                res+=tmp[i]*(end-j+1);                A[k]=tmp[i++];            }            else{                A[k]=tmp[j++];            }        }        while(i<=mid){            A[k++]=tmp[i++];        }        while(j<=end){            A[k++]=tmp[j++];        }    }};






原创粉丝点击