LeetCode 第1题:两数之和

题目描述

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

难度

简单

题目链接

https://leetcode.cn/problems/two-sum/

示例

示例 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(n²)
  • 空间复杂度:O(1)
  • 优点:代码简单直观,空间复杂度低
  • 缺点:时间复杂度高,在数组较大时性能较差

具体步骤:

  1. 使用两层循环,外层循环 i 遍历数组的每个元素
  2. 内层循环 j 从 i+1 开始遍历,寻找和为 target 的另一个数
  3. 如果找到 nums[i] + nums[j] == target,返回下标 [i, j]
  4. 如果遍历完没找到,返回空数组

方法二:哈希表

使用哈希表可以将时间复杂度降到 O(n):

  1. 创建一个哈希表,用于存储每个数字和其下标
  2. 遍历数组,对于每个数字 num:
    • 计算补数 (target - num)
    • 如果补数在哈希表中,则找到答案
    • 否则将当前数字和下标加入哈希表
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
  • 优点:时间复杂度低,查找效率高
  • 缺点:需要额外的空间存储哈希表

代码实现

C# 实现(暴力解法)

public class Solution {
public int[] TwoSum(int[] nums, int target) {
// 外层循环遍历每个元素
for (int i = 0; i < nums.Length; i++) {
// 内层循环从i+1开始,避免重复使用同一个元素
for (int j = i + 1; j < nums.Length; j++) {
// 如果找到两个数的和等于target
if (nums[i] + nums[j] == target) {
return new int[] { i, j };
}
}
}
// 如果没有找到符合条件的数对,返回空数组
return new int[0];
}
}

C# 实现(哈希表解法)

public class Solution {
public int[] TwoSum(int[] nums, int target) {
// 创建字典存储数字和对应的索引
Dictionary<int, int> map = new Dictionary<int, int>(); // 遍历数组
for (int i = 0; i < nums.Length; i++) {
// 计算当前数字需要的补数
int complement = target - nums[i]; // 如果字典中存在这个补数,说明找到了答案
if (map.ContainsKey(complement)) {
return new int[] { map[complement], i };
} // 如果当前数字不在字典中,将其添加到字典
if (!map.ContainsKey(nums[i])) {
map.Add(nums[i], i);
}
} // 如果没有找到符合条件的数对,返回空数组
return new int[0];
}
}

执行结果

暴力解法

  • 执行用时:308 ms
  • 内存消耗:42.8 MB

哈希表解法

  • 执行用时:156 ms
  • 内存消耗:43.5 MB

总结与反思

  1. 这是一道经典的入门题目,考察了基本的算法思维
  2. 暴力解法虽然直观,但效率较低
  3. 使用哈希表可以用空间换时间,提高效率
  4. 这道题告诉我们:
    • 在处理查找问题时,哈希表往往是一个很好的选择
    • 有时候可以通过增加空间复杂度来降低时间复杂度
    • 在实际工程中,通常优先考虑时间复杂度,因为内存通常较为充足

相关题目

  • LeetCode 第15题:三数之和
  • LeetCode 第167题:两数之和 II - 输入有序数组
  • LeetCode 第653题:两数之和 IV - 输入二叉搜索树

LeetCode 第1题:两数之和的更多相关文章

  1. leetcode每日一题——两数之和

    题目: 两数之和 难度: 简单 描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 解法: class Solutio ...

  2. 【leetcode】 算法题 两数之和

      问题       给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...

  3. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

  4. 【JavaScript】Leetcode每日一题-平方数之和

    [JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...

  5. Leetcode:0002(两数之和)

    LeetCode:0002(两数之和) 题目描述:给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表.你可以假设除了数字 0 之外,这两 ...

  6. Leetcode(1)两数之和

    Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一 ...

  7. leetCode刷题 | 两数之和

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

  8. [LeetCode] 1. Two Sum 两数之和

    Part 1. 题目描述 (easy) Given an array of integers, return indices of the two numbers such that they add ...

  9. LeetCode Golang实现 1. 两数之和

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

  10. Leetcode(一)两数之和

    1.两数之和 题目要求: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重 ...

随机推荐

  1. Vim基本使用指南

    一般模式:移动光标的方法 h或 向左方向键(←)光标向左移动一个字符 j或 向下方向键(↓)光标向下移动一个字符 k或 向上方向键(↑)光标向上移动一个字符 l或 向右方向键(→)光标向右移动一个字符 ...

  2. 使用conditional 实现线程精准通讯

    实现3个线程之间依次执行 比如有3个线程A,B,C ,需要按照顺序执行,ABC,ABC 依次执行. 这个使用可以使用 Lock 的 conditional来实现线程之间精准通讯. 点击查看代码 pac ...

  3. Trino 436 - 使用教程(亲测,详细)

    第一章 Trino简介 1. Trino概述 Trino是一个分布式SQL查询引擎,旨在查询分布在一个或多个异构数据源上的大型数据集.如果使用的是数TB或数PB的数据,那么很可能使用的是与Hadoop ...

  4. git commit之后,如何撤销commit

    git reset --soft HEAD^ 仅仅是撤回commit操作,您写的代码仍然保留. HEAD^的意思是上一个版本,也可以写成HEAD~1 如果你进行了2次commit,想都撤回,可以使用H ...

  5. 腾讯云对象存储 COS 荣获对象存储领导力奖!!!

    亚太内容分发大会暨 CDN 峰会一直致力于推动 CDN 产业深度融合发展和市场普及,现已成为亚太地区影响力最大的内容分发网络盛会. 十年来,在以腾讯云.阿里云.网宿科技等亚太 CDN 产业联盟成员孜孜 ...

  6. 【Javaweb】【Maven】【Tomcat10】jsp访问正常,Servlet访问404

    Development Tool:IDEA(Intellij IDEA) Tomcat-Version:10 JDK-version:17 情况描述 我使用Tomcat10运行项目,jsp正常访问,但 ...

  7. docker-compose安装mongo

    创建目录 [root@localhost tools]# mkdir -p /root/tools/mongo/{data,conf,init} 创建初始化用户脚本 [root@localhost m ...

  8. zstd - 一种由Facebook使用的快速数据压缩算法

    Zstandard (也被称为zstd )是一款免费的开源,快速实时数据压缩程序,具有更好的压缩比,由Facebook开发. 它是用C语言编写的无损压缩算法 (在Java中有一个重新实现) - 因此它 ...

  9. Qt编写地图综合应用52-加载离线地图

    一.前言 离线地图的加载其实和在线地图的加载方法几乎一样,唯一的最大区别就是,之前可能一个js文件引入即可,现在需要多个本地的js文件引入,而且网上流传的js文件的版本比较旧,意味着现在新版的支持op ...

  10. An invitation to 3-d vision: from images to geometric models英文pdf下载

    Ma Y, Soatto S, Košecká J, et al. An invitation to 3-d vision: from images to geometric models[M]. N ...