//计算数组的小和
public class MinArrSum{
//方法一,时间复杂度为O(N*N)
public static int GetMinArrSum(int[]arr)
{
if(arr==null||arr.length==0)
{
return 0;
}
int sum=0;
for(int i=arr.length-1;i!=0;i--)
{
for(int j=0;j<i;j++)
{
if(arr[i]>=arr[j])
{
sum+=arr[j];
}
}
}
return sum;
}
//方法二(归并排序),时间复杂度为O(NlogN),额外的空间复杂度为O(N)
public static int GetMinArrSum2(int[]arr)
{
if(arr==null||arr.length==0)
{
return 0;
}
return func(arr,0,arr.length-1);
}
//运用递归函数实现
public static int func(int[]arr,int l,int r)
{
//递归的出口
if(l==r)
{
return 0;
}
int mid=(l+r)/2; //中间位置的数
return func(arr,l,mid)+func(arr,mid+1,r)+merge(arr,l,mid,r);
}
//归并排序的具体实现
public static int merge(int[]arr,int l,int mid,int r)
{
int[]h=new int[r-l+1]; //开辟O(N)的空间
int hi=0;
int i=l;
int j=mid+1;
int smallSum=0;
while(i<=mid&&j<=r)
{
if(arr[i]<=arr[j])
{
smallSum+=arr[i]*(r-j+1);
h[hi++]=arr[i++];
}else
{
h[hi++]=arr[j++];
}
}
for(;(j<r+1)||(i<mid+1);j++,i++)
{
h[hi++]=i>mid?arr[j]:arr[i];
}
//对原数组的重新赋值
for(int k=0;k!=h.length;k++)
{
arr[l++]=h[k];
}
return smallSum;
}
//打印数组的内容
public static void PrintArr(int[]arr)
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[]args)
{
//System.out.println("Hello");
int[]arr={1,3,5,2,4,6};
System.out.println(GetMinArrSum(arr));
PrintArr(arr);
System.out.println(GetMinArrSum2(arr));
PrintArr(arr);
}
}
计算数组的小和
最新推荐文章于 2023-05-09 15:33:52 发布