问题描述:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 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]
  • 解释: nums[1] + nums[2] == 6,返回 [1, 2]

示例 3

  • 输入: nums = [3,3], target = 6
  • 输出: [0,1]
  • 解释: nums[0] + nums[1] == 6,返回 [0, 1]

约束条件

  • 2 <= nums.length <= 10⁴
  • -10⁹ <= nums[i] <= 10⁹
  • -10⁹ <= target <= 10⁹
  • 只会存在一个有效答案

进阶要求

你能想出一个时间复杂度小于 O(n²) 的算法吗?


解法思路

1. 暴力枚举(Brute Force)

  • 时间复杂度: O(n²)
  • 空间复杂度: O(1)
  • 思路
    • 使用双重循环,遍历所有可能的两个数的组合。
    • 检查它们的和是否等于 target,如果找到则返回下标。

2. 哈希表优化(Optimal Solution)

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)
  • 思路
    • 使用哈希表(如 unordered_map)存储 {value: index}
    • 遍历数组,对于每个元素 nums[i],计算 complement = target - nums[i]
    • 检查 complement 是否在哈希表中:
      • 如果存在,直接返回 {map[complement], i}
      • 否则,将当前 nums[i] 存入哈希表。

代码实现

暴力枚举(C++)

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// 暴力枚举
for(int i = 0; i < nums.size(); i++){
for(int j = i + 1; j < nums.size(); j++){
if(nums[i] + nums[j] == target){
return {i, j};
}
}
}
return {}; // 理论上题目保证有解,但最好添加默认返回值
}
};

哈希表优化(C++)



总结

方法 时间复杂度 空间复杂度 适用情况
暴力枚举 O(n²) O(1) 数据量较小
哈希表优化 O(n) O(n) 数据量较大

推荐使用哈希表优化解法,因为它显著降低了时间复杂度,适用于较大的输入规模。

leetcode001 两数之和的更多相关文章

  1. LeetCode_001.两数之和

    LeetCode_001 LeetCode-001.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输 ...

  2. 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

    题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的 ...

  3. LeetCode 170. Two Sum III - Data structure design (两数之和之三 - 数据结构设计)$

    Design and implement a TwoSum class. It should support the following operations: add and find. add - ...

  4. LeetCode 371. Sum of Two Integers (两数之和)

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...

  5. LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  6. [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树

    Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...

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

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

  8. Leetcode(一)两数之和

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

  9. 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数

    问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...

  10. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

随机推荐

  1. webrtc-streamer实时播放监控

    公司要做web端监控实时播放,经过调研,webrtc-streamer的方式对前后端项目侵入最少,且没有延迟卡钝的现象. 一.准备工作 一个摄像头,摄像头对应的rtsp流链接,一台电脑,一个vue项目 ...

  2. 一个简单的大转盘抽奖程序(附.NetCore Demo源码)

    最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql 1.前端实现: 前端用的是基于开 ...

  3. Java03-程序流程控制

    Java程序流程控制 [ 任务列表 ] 1.选择结构(if.switch) 2.循环结构(for.while.do-while) 3.跳转关键字(break.continue.return) 4.其他 ...

  4. SQL SERVER日常运维(一)

    以下语句请使用SA用户或者有DBA权限的用户进行执行,否则可能会出现权限不足报错 一.基础命令 查看当前数据库的版本 SELECT @@VERSION; 查看服务器部分特殊信息 select SERV ...

  5. 第10章 LINQ to XML

    第10章 LINQ to XML 10.1 架构概述--DOM 和 LINQ to XML 的 DOM XML 文档可以用一棵对象树完整的表示,这称为"文档对象模型(document obj ...

  6. Prometheus修改数据存储位置

    Prometheus修改数据存储位置 Prometheus的数据存储位置可以通过配置文件中的 --storage.tsdb.path 参数来指定.默认情况下,数据存储在Prometheus安装目录下的 ...

  7. JUC并发—8.并发安全集合一

    大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的 ...

  8. C#语法糖foreach语句和using语句联合使用

    foreach语句可以和using语句联合使用,比如你需要对多个相机设备进行一些设置,设置完就调用 Dispose() 释放相机资源, 这时可以这样写: 模拟的设备类: class Device : ...

  9. .NET 10 首个预览版发布,跨平台开发与性能全面提升

    前言 2024年2月25日,微软正式推出 .NET 10 预览版 1,标志着这一跨平台开发框架迈入新里程碑. 本次更新聚焦 JIT 编译器优化.运行时性能提升和跨平台开发体验增强,同时引入多项开发者期 ...

  10. thinkphp6实现仿微信朋友圈,用户可发布图片和文字内容,用户可评论,其他用户可评论文章,也可回复用户评论,多层级评论,无限级评论

    功能:仿微信朋友圈,用户可发布图片和文字内容,用户可评论,其他用户可评论文章,也可回复用户评论,多层级评论,无限级评论数据库示例:朋友圈内容表 article表:id content image li ...