思路讲解与算法实现 LeetCode - 两数之和

857 阅读3分钟

聆听 沉淀 传播 … 关注微信公众号【陈皮的JavaLib】,助你放弃编程之路!

每天一道算法题,讲解自己解题思路与实现;欢迎大家点评或者说出你的解题想法;也可评论想让我讲解哪道题!

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

你可以按任意顺序返回答案。

示例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]

示例3:

输入:nums = [3,3], target = 6

输出:[0,1]

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/tw…

一、思路

众所周知,两数之和,即A+B=SUM。在已知SUM的情况下,然后又获得一个A时,只需要找到一个数等于SUM-A

对于一个数组,如果我们采用遍历两两相加的算法,即对于数组的每一个数,都要与其他数进行相加,判断是否等于目标值,这速度是非常慢的,即时间复杂度为O(N²)。

换个角度想,只要遍历过的数和它对应下标,能通过某种规则或者算法(此规则和算法要简单并且速度要快)存放起来,后续我们再去查找这个数能快速查出来,那算法速度就大大提高了。这样只需要遍历一遍数组即可,时间复杂度为O(N)。

既要存取速度快,还能存对应的数和下标键值对,那就非哈希表HashMap莫属了。

算法步骤:

  1. 遍历数组每一个数num,通过 target-num 计算出另一个加数A;
  2. 在map中查找key是否等于A的值,如果存在,则返回当前数的下标和A的下标;
  3. 如果不存在,则将此数num放入map中,key为num,value为num在数组中的下标;

二、算法实现

package com.nobody;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
 *              你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 你可以按任意顺序返回答案。
 *              原题链接:https://leetcode-cn.com/problems/two-sum/
 * @Author Mr.nobody
 * @Date 2021/1/21
 * @Version 1.0
 */
public class TwoSum {

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

        // 记录每一个遍历过的数,利用HashMap插入查找0(1)的高效率时间复杂度
        Map<Integer, Integer> indexMap = new HashMap<>(16);

        // 遍历每一个数
        for (int index = 0; index < nums.length; index++) {
            // target-nums[index]算出另一个加数,然后在map中找有没有这个加数
            if (indexMap.get(target - nums[index]) != null) {
                // 找到了,就返回2个加数的下标
                return new int[] {indexMap.get(target - nums[index]), index};
            } else {
                // 没找到,就将这个数放入map中,key为这个数,value为这个数的下标
                indexMap.put(nums[index], index);
            }
        }
        return null;
    }

	// 测试
    public static void main(String[] args) {
        System.out.println(Arrays.toString(twoSum(new int[] {1, 2, 6, 4, 10, 11, 8, 9}, 16)));
    }
}

输出结果:

[2, 4]

Leetcode执行结果:

在这里插入图片描述

三、上下篇

下一篇思路讲解与算法实现 LeetCode - 两数相加