面试题 16.21. 交换和

这篇博客讨论了一个算法问题,涉及将两个数组通过交换元素使它们的和相等。作者指出,原始的解决方案使用了排序,导致时间复杂度升至10的7次方,这不是最佳方法。解题思路是找到两个数,使得它们的差值等于两个数组和的差值的一半。由于排序后的数组仍无法确保找到合适元素,作者采用了双指针和两种搜索策略来解决。尽管如此,作者认为仍有更简洁的解决方案,并鼓励读者参考大神的做法。
摘要由CSDN通过智能技术生成

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值