【leetcode刷题】1.两数之和——Java版

简介: 有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。 ——leetcode评论区

题目:

给定一个整数数组 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]

提示:


2 <= nums.length <= 103

-109 <= nums[i] <= 109

-109 <= target <= 109

只会存在一个有效答案

Related Topics


数组

哈希表

Solution1

第一种几乎有些java基础的人都可以做出来,双重for循环,暴力查找,有没有相加==target的。


即使简单,也要注意时间复杂度。


内层for循环从i+1开始,因为同一个元素不能使用两遍。

找到解后就可以break退出,因为只有一个解。(有无break运行时间相差近10s)

Code

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] ints = new int[2];
outer:  for (int i = 0; i <nums.length ; i++) {
            for (int j = i+1; j <nums.length ; j++) {
                if (target-nums[i]==nums[j]){
                    ints[0]=i;
                    ints[1]=j;
                    break outer;
                }
            }
        }
        return ints;
    }
}

Result

复杂度分析

  • 时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
  • 空间复杂度:O(1)

20210311002459401.png

Solution2

可以看到题目相关里除了数组还有哈希表,那么考虑将数据存储在hashmap中,这样可以直接判断map中是否包含`x`。省去一层循环。


对于每一个 `x`,我们首先查询哈希表中是否存在 `target - x`,然后将 `x` 插入到哈希表中,即可保证不会让 `x` 和自己匹配。


这里牺牲了内存占用,节约了时间。


Code

class Solution {
        public int[] twoSum(int[] nums, int target) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i <nums.length ; i++) {
                if (map.containsKey(target-nums[i])){
//              这种写法很简单
                    return new int[]{map.get(target-nums[i]),i};
                }
                map.put(nums[i],i);
            }
            return null;
        }
    }

Result

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x
  • 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。

20210311004440991.png

目录
打赏
0
0
0
0
20
分享
相关文章
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
125 1
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
5月前
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
78 0
Leetcode第一题(两数之和)
|
5月前
|
【LeetCode 13】1.两数之和
【LeetCode 13】1.两数之和
34 0
|
5月前
|
LeetCode(一)Java
LeetCode(一)Java
|
7月前
|
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
93 6
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
99 2
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
80 1