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. (Python基础教程之四)Python中的变量的使用

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  2. 基于 JUnit 的全局单元测试程序

    在 Java 程序中,JUnit 是备受开发人员喜爱的单元测试工具.通常,程序员会对每个程序的每个模块写单元测试.对于小型程序来说,程序员只需要手工执行这些单元测试程序就可以,工作量并不大,但是对于中 ...

  3. 如何快速构建基于Spring4.0的Rest API(攻略)

    本文由 ImportNew - 邬柏 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Ja ...

  4. java——棋牌类游戏五子棋(webwzq1.0)之三(Msg)

    package msg; import java.io.ObjectInputStream; import java.net.DatagramSocket; /******************** ...

  5. Chrome插件之油猴(详尽版本)

    官方文档: https://www.tampermonkey.net/documentation.php#google_vignette 1.注释语法: // @match https://passp ...

  6. python3安装与使用(Linux)

    之前写过有关Windows下的python3的安装与使用,这次看一下Linux下的python3 1. 安装依赖环境 yum -y install zlib-devel bzip2-devel ope ...

  7. 关于PageHiOffice插件在win10登录桌面前提示的解决

    win10笔记本开机,在未登录桌面时,总是有PageHiOffice插件已过期的提示. 使用process monitor 的Enable Boot Logging功能进行监视,重启后,再次打开pro ...

  8. 实现不可逆加密文件:探索 GodoOS 的安全机制

    在当今数字化时代,数据安全成为了企业和个人关注的重点.为了保护敏感信息不被未授权访问,各种加密技术应运而生.本文将探讨 GodoOS 项目中实现的一种不可逆加密文件的方法,重点介绍其背后的原理和技术细 ...

  9. 攻防世界:web习题之disabled_button

    攻防世界:web习题之disabled_button 题目内容 https://adworld.xctf.org.cn/challenges/list 打开网页会发现有一个无法点击的按钮 思路 查看该 ...

  10. 【巧用set实现对有序数组O(logn)时间复杂度增、删、查、改、二分操作】codeforces 1041 C. Coffee Break

    题意 第一行输入三个整数 \(n,m,d(1 \leq n \leq 2 * 10^5, n \leq m \leq 10^9, 1 \leq d \leq n)\),第二行输入 \(n\) 个整数, ...