1. 两数之和

题目

原题链接:https://leetcode-cn.com/problems/two-sum/

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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题思路

HashMap通过以空间换取速度的方式,可以将查找时间从\(O(n)\)降低到\(O(1)\)

使用两次迭代

  • 第一次迭代中,将每个元素的和它的索引添加到表中
  • 第二次迭代中,将检查每个元素所对应的目标元素\((target - nums[i])\)是否存在于表中。注意,该目标元素不能是\(nums[i]\)本身

代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 1.两数之和
 * @date 2021-3-6
 * @author chenzufeng
 */
public class No1_TwoSum {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] strings = reader.readLine().split(" ");

        int[] nums = new int[strings.length];
        for (int i = 0; i < strings.length; i++) {
            nums[i] = Integer.parseInt(strings[i]);
        }

        int target = Integer.parseInt(reader.readLine());

        System.out.println(Arrays.toString(twoSum(nums, target)));
    }

    public static int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashMap = new HashMap<>();
        // 第一次遍历,记录key和value
        for (int i = 0; i < nums.length; i++) {
            hashMap.put(nums[i], i);
        }

        // 第二次遍历,查找目标值
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (hashMap.containsKey(complement) && hashMap.get(complement) != i) {
                return new int[] {i, hashMap.get(complement)};
            }
        }

        return null;
    }
}
posted @ 2021-03-07 23:46  chenzufeng  阅读(71)  评论(0编辑  收藏  举报