两数之和

Posted xiqingbo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两数之和相关的知识,希望对你有一定的参考价值。

前言:本人第一次刷LeetCode,我是按照题目顺序开始刷的,第一题为“两数之和”、即使难度为“简单”,但仍然花费了很长时间才勉强做出来,为什么说是勉强做出来?因为我仅仅是实现了功能,但是在做法以及时间、空间复杂度上却比较笨重且消耗了大量的资源,但仍然想借此记录一下, 毕竟是耗费了脑细胞的劳动结晶,哈哈哈。
题目:
给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
以下是解题代码:
public class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 定义一个数组接收返回的两个数组下标
        int[] indexes = new int[2];
        // 外层循环:所有数相加需要循环数组length-1次
        // (例如:4个数需要经过第一次循环:1和2、3、4相加;第二次循环:2和3、4相加;第三次循环:3和4相加,共三次)
        for (int i = 0; i < nums.length - 1; i++) {
            // 定义内层循环依次相加的数组的下标(例如:第一次循环的2、3、4;第二次循环的3、4;第三次循环的4)
            int k = i + 1;
            // 内层循环:每次循环需要数组length-1-i次
            // (例如:1和2、3、4相加循环3次;2和3、4相加循环2次;3和4相加循环1次)
            for (int j = 0; j < nums.length - 1 - i; j++) {
                // 依次通过相加检验是否与目标值相等,如果相等,分别将两数对应的当前变量存入事先定义好的数组中,确定为下标
                if (nums[j] + nums[k] == target) {
                    indexes[0] = j;
                    indexes[1] = k;
                }
                k++;
            }
        }
        return indexes;
    }
}
这是我刚刚又重新提交了一次的执行结果反馈:

技术图片

于是我带着挫败又虚心的心态去查看学习了别人提交的代码以及官方答案,不得不说:简洁易于理解、思路清晰的解题方法与思路真是让我无比佩服,证明了我要学的还有太多了

官方方法一:暴力法

暴力法很简单,遍历每个元素 x,并查找是否存在一个值与 target - x 相等的目标元素。
class Solution {
    public int[] twoSum(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 };
                }
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}
复杂度分析:
  • 时间复杂度:O(n^2)
    对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)的时间。因此时间复杂度为 O(n^2)
  • 空间复杂度:O(1)

当然这只是其中一种解决方法,官方还给出了:
方法二:两遍哈希表(包含有 n 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1) ,所以时间复杂度为 O(n))
方法三:一遍哈希表(只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间)
以上两种方法皆降低了时间复杂度,提高了算法的效率,在这里就不详细列举了,大家可以在两数之和-题解中仔细研究。





以上是关于两数之和的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript笔试题(js高级代码片段)

数组练习题:两数之和三数之和四数之和

LeetCode第5天 - 283. 移动零 | 167. 两数之和 II - 输入有序数组

01两数之和

01两数之和

两数之和