Java 找到一个有效的算法,以降低大O复杂度
给定N个元素的排序数组。需要找到所有元素差异的绝对和。 例:给定4个元素1、2、3和4|1-2|+|1-3|+|1-4|+|2-3|+|2-4|+|3-4| = 10. 以下是我的java代码:Java 找到一个有效的算法,以降低大O复杂度,java,algorithm,nested-loops,Java,Algorithm,Nested Loops,给定N个元素的排序数组。需要找到所有元素差异的绝对和。 例:给定4个元素1、2、3和4|1-2|+|1-3|+|1-4|+|2-3|+|2-4|+|3-4| = 10. 以下是我的java代码: List<Integer> a = new ArrayList<Integer>(); //just for understanding , the Array List is already filled with numbers public static int lsum
List<Integer> a = new ArrayList<Integer>(); //just for understanding , the Array List is already filled with numbers
public static int lsum(int N)//consider the arraylist to be sorted in ascending order.
{
int sum =0;
for( int i=0;i<N;i++)
{
int w =a.get(i);
for(int j =i;j<N;j++)
{
int z = a.get(j);
sum =sum +(z-w);
}
}
return(sum);
}
List a=new ArrayList()//为了便于理解,数组列表中已经填充了数字
public static int lsum(int N)//考虑按升序排序arraylist。
{
整数和=0;
对于(inti=0;i如果您首先对元素进行排序,则可以将运行时降到O(nlogn)
这里的想法是,如果a[]
是按排序顺序排列的整数列表,而b[i]
是a[i]
和其他数字之间的差值之和,那么b[i+1]
可以根据b[i]
、i
、a[i]-a[i]
和数组长度直接计算
我不想说具体如何,但这里有一个提示。Math.abs(a[I+1]-a[j])
与Math.abs(a[I]-a[j])
有多少不同?对于哪个j
是Math.abs(a[I+1]-a[j])
更大?对于哪个j
来说更小
现在,在你计算完这些之后,b[i]
s在它们之间包含每一个差两次。你想要的值就是它们的和除以2。如果数组是x\u 1,请转到。@Jeroenvanevel没有太多帮助,因此没有收到任何答案,因此重新发布。