每日一题 - 两数之和

106 阅读2分钟

点赞再看,养成习惯


题目

1. 描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

来源:力扣(LeetCode)

链接leetcode.cn/problems/tw…

示例1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例2:

输入: nums = [3,2,4], target = 6
输出: [1,2]

题解

1. 暴力破解

思路: 暴力枚举通常是我们解题时最常想到的方法,例如此题我们的目标是寻找相加等于target的两个数组元素。假设我们在遍历数组时的当前元素为currentValue,此时我们就需要再次去数组中遍历寻找一个值,此值等于target - currentValue ,若能找到则返回两个元素下标,若找不到则返回null。

代码:

/*枚举解法*/
private static int[] twoSumByExhaustion(int[] nums, int target) {
    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] == target - nums[i]) {
                return new int[]{i, j};
            }
        }
    }
    return null;
}

复杂度分析:

  • 时间复杂度:O(N^2),其中 N 是数组中的元素数量。
  • 空间复杂度:O(1)。

运行结果:

image.png

2. hash表

思路: 由于本题并没有限制我们使用额外的内存空间,因此我们可以借助额外的内存空间存储数组中的元素以达到减少遍历次数的目的。

代码:

/*hash表解法*/
private static int[] twoSum(int[] nums, int target) {
    // 首先创建一个hash表
    Map<Integer, Integer> intMap = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        // 判断hash表中是否已经存有目标元素
        Integer integer = intMap.get(target - nums[i]);
        if (integer != null) {
            // 若有则返回坐标
            return new int[]{integer, i};
        }
        // 如没有则存放元素,继续遍历
        intMap.put(nums[i], i);
    }
    return null;
}

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组中的元素数量。
  • 空间复杂度:O(N)。

运行结果:

image.png

结语

今天的内容就到此结束了,有疑问的小伙伴欢迎评论区留言或者私信博主,博主会在第一时间为你解答。

码字不易,感到有收获的小伙伴记得要关注博主一键三连,不要当白嫖怪哦~

如果大家有什么意见和建议请评论区留言或私聊博主,博主会第一时间反馈的哦