LeetCode简单篇----1----两个数之和(3种算法)

LeetCode官方题解:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/

目录

一 、需求

二、暴力匹配算法

思路分析

算法实现

复杂度分析

三、两边哈希表实现

思路分析

算法实现

复杂度分析

四、一遍哈希表

思路分析

算法实现

复杂度分析


一 、需求

        A:给定一个整数数组 nums 和一个目标值 target;

        B:在该数组中找出和为目标值的那两个整数;

        C:找到后返回他们的数组下标;

        D:每种输入只对应一个答案;

        E:不能重复使用数组中同样的元素,如数组[5,4,6,8],当target为10时,不能两次都使用5;

二、暴力匹配算法

  • 思路分析

        A:使用数组第1个元素与第2,3,4依次相加,加法结果与target比较

          a:相等:将这两个元素对应的下标返回;

          b:不相等:回到A(这时候从第2个元素开始);

        B:输出结果;

  • 算法实现

class Solution {

    public int[] twoSum(int[] nums, int target) {

        for(int i = 0; i < nums.length-1; i++) {

            for(int j = i+1 ; j < nums.length; j++) {

                if(nums[i]+nums[j] == target) {

                    return new int[] {i,j};

                }

            }

        }

    throw new IllegalArgumentException("No two sum solution");

    }

}
  • 复杂度分析

       A:两层循环,时间复杂度为O(n^2);

       B:空间复杂度为O(1);

三、两边哈希表实现

  • 思路分析

        A:为什么要使用HashMap?

          a:key唯一且无顺序要求,采用HashHashMap即可;

        B:定义集合Map泛型,在堆内存开辟HashMap子类对象,这里用到多态;

        C:向集合中添加键和值

          a:通过for循环添加,数组值作为键,其对应的下标作为值(因为要找的是下标);

        D:到Map集合里查找

          a:利用for循环,得到每一个键(也就是数组值);

          b:将target与得到的键相减,结果保存到辅助变量中;

          c:然后就去集合里找这个结果是否存在,并且不能和减数是同一个值;

        E:最后返回结果;

  •  算法实现

class Solution {

    public int[] twoSum(int[] nums, int target) {

        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {

            map.put(nums[i], i);

        }

        for (int i = 0; i < nums.length; i++) {

            int complement = target - nums[i];

            if (map.containsKey(complement) && map.get(complement) != i) {

                return new int[] { i, map.get(complement) };

            }

        }

        throw new IllegalArgumentException("No two sum solution");

    }

}
  • 复杂度分析

       A:代码中将n个元素遍历了2次,哈希表查找元素是O(1),所以时间复杂度为O(n);

       B:因为哈希表存储了n个元素,所以空间复杂度为O(n);

四、一遍哈希表

  • 思路分析

        A:定义带有泛型的集合map,在堆内存生成HashMap子类对象;

        B:利用for循环,得到每一个数组值;

        C:设置辅助变量,保存target与数组值相减后的结果;

        D:查找该结果是否在map集合里,不存在就添加到集合,存在就返回结果;

          a:第一次循环,map里没有元素,那么nums[0]就加入到集合中;

          b:第二次循环,判断complement是否在map中,而map中只有一个元素,也就是complement与nums[0]比较

            相    等: 返回下标[0 1] ;

            不相等: 将nums[1]加入到map中,到步骤c;

          c:第三次循环,就是将complement与map中nums[0],nums[1]比较

            相   等: 返回下标[0 2]或[1 2];

            不相等: 将nums[2]加入到map中,到步骤d;

          d:第四次循环,就是将complement与map中nums[0],nums[1],nums[2]比较

            相    等: 返回下标[0 3] 或 [1 3] 或[2 3];

            不相等: 将nums[3]加入到map中,然后退出循环;

  • 算法实现

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[] { map.get(complement), i };
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}
  • 复杂度分析

       A:代码中将n个元素遍历了1次,所以时间复杂度为O(n);

       B:哈希表存储了n个元素,所以空间复杂度为O(n);

发布了62 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Sruggle/article/details/103748396