10的5次方的复杂度,用了sort函数,达到了10的7次方的复杂度。这肯定不是最好的办法。
解题思想就是交换两个数肯定不是相等的,必然一大一小,那么一定有一个数组是加一个数,一个数组是减去一个数,而这个数都是通过交换的这两个数加减所得到的,所以两个数组加上和减去的数的绝对值是相等的,那么我们需要寻找的就是两个数组的和相减,就是她们的差值,想让他们相等,只需要在数组里面寻找差值等于和的差值的一半的两个数,平均分给两个数组即可。
还有就是需要注意的是即使排完序,也没有办法根据差值的大小确定谁往前走,因为一个数组可能存在有一个特别小,别另外一个数组的数都小,但是这个数组的其他的值比另外一个数组都大的情况,那么就会卡到这,把另外一个数组遍历完也找不着答案,所以我就分两种情况跑了两次。
这肯定不是最简便的,太麻烦了 ,去看看大神的做法。
class Solution {
public static int[] findSwapValues(int[] array1, int[] array2) {
int len1=array1.length;
int len2=array2.length;
int sum1=0,sum2=0;
for(int i=0;i<len1;i++){
sum1+=array1[i];
}
for(int i=0;i<len2;i++){
sum2+=array2[i];
}
int[] res=new int[2];
int x=Math.abs(sum1-sum2);
if(x%2!=0)return new int[0];
x=x/2;
Arrays.sort(array1);
Arrays.sort(array2);
int flag=0;
int i=0,j=0;
while(i<len1&&j<len2){
if(Math.abs(array2[j]-array1[i])==x){
flag=1;
res[0]=array1[i];
res[1]=array2[j];
break;
}
else if(Math.abs(array2[j]-array1[i])>x){
i++;
}
else
{
j++;
}
}
if(flag==1) return res;
flag=0;
i=0;j=0;
while(i<len1&&j<len2){
if(Math.abs(array2[j]-array1[i])==x){
flag=1;
res[0]=array1[i];
res[1]=array2[j];
break;
}
else if(Math.abs(array2[j]-array1[i])>x){
j++;
}
else
{
i++;
}
}
if(flag==0) return new int[0];
return res;
}
}