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. Five minute introduction to ANTLR 3

    What is ANTLR 3? ANTLR - ANother Tool for Language Recognition - is a tool that is used in the const ...

  2. Java开发

    总结java开发中知识点和问题点 基础: 常用加解密算法: [md5] import java.security.MessageDigest; public static final String e ...

  3. elementUI 选择开始结束日期加限制

    需求是开始结束日期不得大于当前时间,当开始日期发生变化时,结束日期不得小于开始日期且不得大于当前日期 <el-form-item label="开始日期:"> < ...

  4. xlsx.js 表格的导出与导入

    1.xlsx简介 通俗的说,xlsx这个插件可以把html中的table元素或者json数据转换成表格后进行导出 <script src="https://cdn.bootcdn.ne ...

  5. 源启行业AI平台 银行智能业务的驱动引擎

    AI技术已经深入金融行业,在营销.渠道.风控等领域广泛应用,但人工智能开发与应用面临成本高.难度大.门槛高.重复建设.无统一管理复用AI模型资产等问题,这些问题也正是源启AI行业平台要解决的. 源启行 ...

  6. Yakit靶场-高级前端加解密与验签实战-全关卡通关教程

    一.前端验签-SHA256 本文作者为CVE-柠檬i CSDN:https://blog.csdn.net/weixin_49125123 博客园:https://www.cnblogs.com/CV ...

  7. 跨语言国密SM4加解密实战:Java与Golang无缝对接

    概述 本文详细介绍了如何在Java和Golang中使用SM4算法进行对称加密和解密操作.通过使用CBC模式和PKCS5填充,成功实现了跨语言的数据加密和解密.无论是Java加密后在Golang解密,还 ...

  8. 如何在 Linux 中使用 grep 命令的排除功能

    来自grep 是一种强大的命令行工具,用于在一个或多个输入文件中搜索与正则表达式匹配的行,并将匹配的行标准输出.在本文中介绍如何在使用 grep 搜索时排除一个或多个单词或目录.   排除单词或多个条 ...

  9. ChannelInboundHandlerAdapter和SimpleChannelInboundHandler区别

    ChannelInboundHandlerAdapter和SimpleChannelInboundHandler是我们在使用Netty处理Handler时候很常用的两个继承类,虽然说二者实现的功能大致 ...

  10. 即时通讯技术文集(第23期):IM安全相关文章(Part12) [共15篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第23 期. [- 1 -] 理论联系实际:一套典型的IM通信协议设计详解(含安全层设计) [链 ...