大数据量下求N=a+b的组合

题目:数组A由1000W个随机正整数(int)组成,设计算法,给定整数n,在A中找出符合如下等式:n=a+b的a和b,说明算法思路以及时间复杂度是多少?

方法一:

设一个辅助容器temp长度为N+1
遍历A,将A中小于等于N的数字填入temp,具体的表现在temp中就是,其下标就是其位置元素的大小
填完之后,遍历temp,找出i位置和n-i位置不为空的,而且这里要防止重复

代码:
    public void printNequalAB(int[] arr,int N){
        //数组A由1000W个随机正整数(int)组成,设计算法,给定整数n,
        // 在A中找出符合如下等式:n=a+b的a和b,说明算法思路以及时间复杂度是多少?
        if (arr==null||N<0){
            return;
        }

        int[] temp=new int[N+1]; //可以放0~N上闭区间的数
        for(int i=0;i<arr.length;i++){
            if (arr[i]<=N){
                if (temp[arr[i]]!=1){
                    temp[arr[i]]=1;
                }
            }
        }//向temp里注入小于N的数,以其数字大小找到其位置


        for(int i=0;i<temp.length;i++){
            if (temp[i]==1&&temp[N-i]==1&&(i<N-i)){//(i<N-i) 去重处理
                System.out.println(i+" "+(N-i));
            }
        }
 }

方法二:双指针法

先排序
然后定义两个指针,根据两端数值大小移动两个指针
前面写过一样的题目了,这里就不重复写了,可以参考下面链接https://www.jianshu.com/p/8985b009dacd

方法三: 利用hash的存取速度为O(1)的特性

1.将数组A中的数据,存入Hash表;
2.遍历A数组,假设当前取到的值为a = A[i],则b = x-A[i];
3.在Hash表中查找b,如果存在则返回,否则继续2-3,直至找到符合要求的解。
时间复杂度O(n)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容