【数组】-Lc1-两数之和(结合Map变两数之差)

写在前面

  最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。


目录

  • 写在前面
  • 一、场景描述
  • 二、具体步骤
    • 1.环境说明
    • 2.代码
  • 写在后面


一、场景描述

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

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

二、具体步骤

1.环境说明

名称 说明
IntelliJ IDEA 2019.2

2.代码

以下为Java版本实现:


public class Lc1_twoSum {

    public static void main(String[] args) {
        int[] nums = {2, 7, 11, 15};
        int target = 9;
        int[] result = twoSum(nums, target);
        System.out.println(Arrays.toString(result));
    }

    /**
     * O(n)
     *
     * 思路:循环 + map
     *
     * 返回值是int[]
     * 二数之和可以结合map变成二数之差
     *
     * 定义一个map(key为数组中的值,value为key在数组中的位置)
     * 循环数组,得到nums[i], remain = target - nums[i]
     * 判断remain是否在map中
     *      是,返回i以及map.get(remain)
     *      否则,添加到map中
     * 循环结束,则为找不到这样的值
     *
     */
    private static int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            // 用target-当前值,然后判断map中是否包含
            int remain = target - nums[i];
            if (map.containsKey(remain)) {
                return new int[]{map.get(remain), i};
            }
            map.put(nums[i], i);
        }

        throw new IllegalArgumentException("no solution");
    }
}


写在后面

  如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。

你可能感兴趣的:(数据结构与算法,算法,数据结构,leetcode,数组)