zoukankan      html  css  js  c++  java
  • 找出数组中两数之和为指定值的所有整数对

    一,问题描述

    给定一个整型数组(数组中的元素可重复),以及一个指定的值。打印出数组中两数之和为指定值的 所有整数对

    二,算法分析

    一共有两种方法来求解。方法一借助排序,方法二采用HashSet

    方法一:

    先将整型数组排序,排序之后定义两个指针left和right。left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素

    将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--;若前者小,left++;若相等,则找到了一对整数之和为指定值的元素。

    此方法采用了排序,排序的时间复杂度为O(NlogN),排序之后扫描整个数组求和比较的时间复杂度为O(N)。故总的时间复杂度为O(NlogN)。空间复杂度为O(1)

    方法二:

    依次遍历整型数组,对整型数组中的每一个元素,求解它的suplement(expectedSum-arr[i]).suplement就是指定的值减去该数组元素。

    如果该元素的 suplement不在HashSet中,则将该元素添加到HashSet。

    如果该元素的suplement在HashSet中,说明已经找到了一对整数之和为指定值的元素。

    该方法使用了HashSet,故空间复杂度为O(N),由于只需要扫描一遍整型数组,故时间复杂度为O(N)

    三,完整代码实现:

    import java.util.Arrays;
    import java.util.HashSet;
    
    public class ExpectSumOfTwoNumber {
        
        public static void expectSum_bySort(int[] arr, int expectSum)
        {
            if(arr == null || arr.length == 0)
                return;
            Arrays.sort(arr);
            int left = 0, right = arr.length - 1;
            
            while(left < right)
            {
                if(arr[left] + arr[right] > expectSum)
                    right--;
                else if(arr[left] + arr[right] < expectSum)
                    left++;
                else//equal
                {
                    System.out.println(arr[left] + " + " + arr[right] + " = " + expectSum); 
                    left++;
                    right--;
                }
            }
        }
        
        
        public static void expectSum_bySet(int[] arr, int expectSum)
        {
            if(arr == null || arr.length == 0)
                return;
            HashSet<Integer> intSets = new HashSet<Integer>(arr.length);
            
            int suplement;
            for (int i : arr)
            {
                suplement = expectSum - i;
                if(!intSets.contains(suplement)){
                    intSets.add(i);
                }else{
                    System.out.println(i + " + " + suplement + " = " + expectSum);
                }
            }
        }
        
        //hapjin test
        public static void main(String[] args) {
            int[] arr = {2,7,4,9,3};
            int expectSum = 11;
            expectSum_bySet(arr, expectSum);
            System.out.println("************");
            expectSum_bySort(arr, expectSum);
            System.out.println("----------------");
            int[] arr2 = {3,7,9,1,2,8,5,6,10,5};
            int expectSum2 = 10;
            expectSum_bySet(arr2, expectSum2);
            System.out.println("**********");
            expectSum_bySort(arr2, expectSum2);
        }
    }

    原文:http://www.cnblogs.com/hapjin/p/5746659.html

  • 相关阅读:
    Zookeeper 记录
    Eureka 分析记录
    Hbase 学习记录
    小技巧 Mongodb 动态查询 除去 _class 条件
    科技的继续发展会带给我们什么?
    无限拓展热区域缓存服务方案
    Git 的 4 个阶段的撤销更改
    自动化运维利器 Fabric
    Linux Shell 文本处理工具
    如何在 Linux 中找出 CPU 占用高的进程
  • 原文地址:https://www.cnblogs.com/hapjin/p/5746659.html
Copyright © 2011-2022 走看看