前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两数之和:二哥的LeetCode刷题笔记第一题

两数之和:二哥的LeetCode刷题笔记第一题

作者头像
沉默王二
发布2023-09-12 17:47:16
1950
发布2023-09-12 17:47:16
举报
文章被收录于专栏:沉默王二沉默王二

题意

给出一个数组和一个目标值,让你在该数组中找出和为目标值的两个数,并且这两个数在数组中的下标不同。

示例

代码语言:javascript
复制
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

难度

简单

分析

首先,我们能够很自然地想到暴力遍历数组的这个方法,两层遍历,第一层确定第一个数,第二层确定第二个数,从而完成题目的要求。

说句题外话,“暴力”一词在算法领域表示“穷举、极低效率的实现”,可能就是源于这个英文词(Brute-Force,蛮力攻击)。

代码语言:javascript
复制
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[i] + nums[j] == target)
                    return new int[]{i,j};
            }
        }

        throw new IllegalArgumentException("No two sum solution");
    }
}

笔试的时候如果遇到不太会的题,就暴力。不过两次遍历的时间复杂度是

O(n^2)

时间复杂度,在算法领域是一个非常重要的概念,https://tobebetterjavaer.com/collection/time-complexity.html了解。

O(n^2)

的时间复杂度实在是太不理想了,效率还是太低,在所有 Java 提交中只能击败不到 22% 的用户。

我们能不能优化一下呢?

观察第二个循环,我们是从每个i的后面的数中寻找一个与之相加能够凑成目标值target的。

那我们就反过来想,能不能判断每个i前面的数是否存在与之相加能够凑成目标值target的呢?

可能你会脑袋一热写出下面这样的代码:

代码语言:javascript
复制
class Solution{
    public int[] twoSum(int[] nums,int target){
        for(int i = 0;i < nums.length;i++)
            for(int j = 0;j < i;j++)
                if(nums[i] + nums[j] == target)
                    return new int[]{i,j};
        throw new IllegalArgumentException("No two sum solution");
    }
}

但是这样的算法时间复杂度和之前相比根本没有变化。

再想一下,每一个i前面的数我们之前访问过,所以我们可以用一个HashMap来记录每一个i前面的数的出现情况以及坐标,这样子就可以快速地查到它前面的数了。

代码语言:javascript
复制
class Solution{
    public int[] twoSum(int[] nums,int target){
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < nums.length;i++){
            int sub = target - nums[i];
            if(map.containsKey(sub))
                return new int[]{i,map.get(sub)};
            map.put(nums[i],i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}

时间复杂度:

O(n)

空间复杂度:

O(Max\{nums[i]\})

这次结果就不一样了,打败了 70.02% 的选手。

001-01.png

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-11 14:44,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 沉默王二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • 示例
  • 难度
  • 分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档