【每日算法】力扣1. 两数之和

126 阅读1分钟

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 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]

提示:

2 <= nums.length <= 104

-109 <= nums[i] <= 109

-109 <= target <= 109

只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

做题

这道题比较简单。

时间复杂度 O(n^2) 的解法就是,先确定一个数,然后去和后面的数一个个相加,看看和是不是 target,需要双层循环。

时间复杂度为 O(n) 的解法太简单了。我们需要使用 map,遍历的时候从 使用 target 减去当前的数,找找 map 中有没有差,有的话就是找到了两个数,没有的话就把值作为 key,下标作为 value 存进 map 中。这样就能一次循环就完成了。

上代码!

public int[] twoSum(int[] nums, int target) {
    Map<Integer,Integer> map=new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int num = nums[i];
        Integer integer = map.get(target - num);
        if (integer!=null){
            //找到了
            return new int[]{i,integer};
        }
        //存进 map
        map.put(num,i);

    }
    return null;
}

image.png

easy!

最后

做完这道题,感觉回到了大学,力扣的数据结构题貌似都是大学课本上有的,以前没有好好学的东西,现在就要来补了。

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。