zoukankan      html  css  js  c++  java
  • 力扣第一题 两数之和扩展版

    题目

      在《力扣第一题 两数之和》中,我们给出了三种求解力扣第一题两数之和的方法,这里给出一个它的升级版:找出所有两数之和为target的数组下标。

      力扣第一题 两数之和扩展版:给定一个元素个数为N的整数数组 nums 和一个整数目标值 target,请在该数组中找出所有和为 target  的那两个整数,并返回它们的数组下标。假设可以按任意顺序返回答案。但是,数组中同一个元素在答案里不能重复出现。

    基于哈希表找出所有两数之和

      首先定义一个对象 Map<String, Integer> map,key为一个由英文逗号分隔的、任意两个数的下标组成的字符串,value为两数之和。然后,遍历数组,将任意两数之和存入map。最后,遍历map,如果value等于target,则返回其key,这个key就是我们想要的数组下标。答案基于《力扣第一题 两数之和》的第三种解法,稍作重构即可,代码如下:

        /**
         * 二次遍历map,为求解所有两数之和等于target的整数做铺垫
         * @param nums
         * @param target
         * @return
         */
        public static List<String> allSolution(int[] nums, int target) {
            Map<String, Integer> map = new HashMap<>();
            for (int i = 0, len = nums.length; i < len; i++) {
                int numI = nums[i];
                for (int j = i + 1; j < len; j++) {
                    map.put(i + "," + j, numI + nums[j]);
                }
            }
            // 保存结果集
            List<String> rets = new ArrayList<>();
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                if (entry.getValue() == target) {
                    rets.add(entry.getKey());
                }
            }
    
            return rets;
        }
        
    
    复杂度分析
    • 时间复杂度:O(N^2))。最坏情况下数组中任意两个数都要被匹配一次。

    • 空间复杂度:O(N)。


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    正则表达式
    JavaIO详解
    Java集合类详解
    Java虚拟机原理图解
    关于Java中按值传递和按引用传递的问题详解
    图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)
    The 70th problem,UVa10396 Vampire Numbers
    二叉树的实现(Java语言描述)
    编程之路
    AngularJS 开发中常犯的10个错误
  • 原文地址:https://www.cnblogs.com/east7/p/14853757.html
Copyright © 2011-2022 走看看