leetcode_001_两数之和解析

news2024/12/23 20:45:48

两数之和解析

题目:

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

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

这个问题要求你设计一个高效的算法来找到数组中两个数,使得它们的和等于一个给定的目标值。
这要求你能够分析问题的本质,并设计出合适的解决方案。
这个问题的本质是搜索与匹配的问题,更具体地说,是在无序数组中查找满足特定条件(和为目标值)的两个数。

暴力解法1

在这里插入图片描述

最直接的方法是使用两层嵌套循环遍历数组,对于每对元素,检查它们的和是否等于目标值。这种方法的时间复杂度是O(n^2),其中n是数组的长度,对于大数据集来说效率很低。

func twoSum1(nums []int, target int) []int {
	for i := 0; i < len(nums); i++ {
		for j := 0; j < len(nums); j++ {
			if i == j { // 因为题目中不能使用两次相同的元素
				continue
			}
			if nums[i]+nums[j] == target {
				return []int{i, j}
			}
		}
	}
	return nil
}

我们仔细观察下这个两层循环,会发现有重复的比较。

当i=0时,nums[0]=2,2和5、9、4、11进行相加。

当i=1时,nums[1]=5,5和2、9、4、11进行相加。

可以发现nums[1]=5和2相加,已经被计算过了。

当i=2时,nums[2]=9,9和2、5、4、11进行相加。

可以发现nums[2]=9和2、5相加,已经被计算过了。

当i=3时,nums[3]=4,4和2、5、9、11进行相加。

可以发现nums[3]=4和2、5、9相加,已经被计算过了。

下面进行优化,减少重复计算。

暴力解法2

在这里插入图片描述

第二层循环从j开始(j>=i+1)

func twoSum2(nums []int, target int) []int {
	for i := 0; i < len(nums); i++ {
		for j := i + 1; j < len(nums); j++ {
			if nums[i]+nums[j] == target {
				return []int{i, j}
			}
		}
	}
	return nil
}

哈希法1:

target=6,当num=2,需要在数组中找出6-2=4,这种查找,哈希最擅长,时间复杂度还是O(1)。

比较常规的方法,先把整个数组建立一个hash表,然后进行查找。

func twoSum3(nums []int, target int) []int {
	// key:数值,value:下标
	hashTable := make(map[int]int, 0)
	for i, num := range nums {
		hashTable[num] = i
	}
	for i := 0; i < len(nums); i++ {
		if v, ok := hashTable[target-nums[i]]; ok {
			return []int{i, v}
		}
	}
	return nil
}

哈希法2:

上一个哈希法,可以优化为不提前建立哈希表,在循环的过程中建立哈希。

func twoSum4(nums []int, target int) []int {
    // key:数值,value:下标
    nummap := make(map[int]int, 0)
    for i := 0; i < len(nums); i++ {
       if v, ok := nummap[target-nums[i]]; ok {
          return []int{v, i}
       } else {
          nummap[nums[i]] = i
       }
    }
    return nil
}

总结:

这个问题的本质是搜索。更具体地说,是在无序或有序数组中查找满足特定条件(和为目标值)的两个数。

这个问题通常可以通过以下几种方式解决,每种方式都体现了不同的算法思想和技巧:
暴力法(Brute Force)
//最直接的方法是使用两层嵌套循环遍历数组,对于每对元素,检查它们的和是否等于目标值。这种方法的时间复杂度是O(n^2),其中n是数组的长度,对于大数据集来说效率很低。
哈希表(Hash Table)
更高效的方法是使用哈希表来记录遍历过的元素和它们的索引。遍历数组时,对于每个元素,我们检查目标值减去当前元素的结果是否已经在哈希表中。如果在,说明我们找到了满足条件的两个数;如果不在,将当前元素及其索引添加到哈希表中。这种方法的时间复杂度是O(n),其中n是数组的长度,因为它只需要遍历数组一次。
双指针法(Two Pointers)
(当数组有序时):如果数组是有序的,我们可以使用双指针法。一个指针从头开始,另一个指针从尾开始。根据两个指针所指向元素的和与目标值的大小关系,移动较小的那个指针(如果和小于目标值,移动头指针;如果和大于目标值,移动尾指针)。这种方法的时间复杂度也是O(n),但它要求数组必须是有序的。

思考题
如果 nums 是有序的,是否还需要哈希表?
如果要求寻找三个数,它们的和等于 target 呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解压即玩】使命de召唤4

《使命de召唤4》 立即下载&#xff1a;【chumenx.com】【解压即玩】使命de召唤4

Leetcode 51. 皇后 回溯 C++实现

Leetcode 51. 皇后 问题&#xff1a;按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不…

Spring框架基础

前言 本文将讲解spring框架的基础内容 Spring 首先,我们需要了解,spring是什么? spring是一个轻量级的IOC和AOP的一站式java开发框架 作用是简化企业级开发 轻量级:框架体积小(核心模块) 其中 IOC: Inversion of Control 控制反转 IOC的作用是可以把创建对象的控制权,反转给s…

学习区块链?看我就够了!

写在前面&#xff0c;本文提到的所有书籍资源&#xff0c;都提供免费下载地址 内含pdf&#xff0c;epub,mobi等格式 一.区块链&#xff1a;定义未来金融与经济新格局 以区块链技术为核心构建的价值互联网 将深刻改变未来的金融与经济格局 文明向前发展&#xff0c;有些成果的…

Linux基础软件-共享存储nfs

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux日常运维。讲的那些东西都算是系统自带的&#xff0c;但是Linux作为一个…

大模型之二十七-语音识别Whisper实例浅析

Whisper简介 Whisper是OpenAI于2022年9月开源的一个多语种识别模型&#xff0c;目前支持99种语言&#xff0c;是目前性能最好的开源多语种识别ASR大模型&#xff0c;第一版版使用了68万小时标注好的语料预训练模型&#xff0c;而large-v3的标注数据超过了500万小时&#xff0c…

QL5010-16-ASEMI逆变焊机专用整流桥QL5010

编辑&#xff1a;ll QL5010-16-ASEMI逆变焊机专用整流桥QL5010 型号&#xff1a;QL5010 品牌&#xff1a;ASEMI 封装&#xff1a;KBPC-4 批号&#xff1a;2024 类型&#xff1a;整流模块 电流&#xff1a;50A 电压&#xff1a;1600V 安装方式&#xff1a;直插式封装 …

(2)Studio 5000 Logix Emulate仿真使用方法

Studio 5000 Logix Emulate仿真使用方法 引言&#xff1a;首先要安装好Studio 5000 logix emulate&#xff0c;这个软件也是需要授权的。还需要注意仿真器与studio 5000之间版本的对应&#xff0c;studio5000的版本需要小于仿真器版本。 打开Studio 5000 logix emulate&#x…

Lombok组件的使用

什么是Lombok Lombok是一个Java库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要为类编写getter或eques方法&#xff0c;同时可以自动化日志变量。 Lombok的使用 使用Lombok需要的开发环境JavaMavenIntelliJ IDEA或…

游戏开发设计模式之桥接模式

目录 桥接模式在游戏开发中的具体应用案例是什么&#xff1f; 如何在Unity或Unreal Engine中实现桥接模式以提高游戏引擎与场景的灵活性&#xff1f; 桥接模式与其他设计模式&#xff08;如适配器模式、模板方法模式&#xff09;在游戏开发中的比较优势是什么&#xff1f; …

【Verilog 数字系统设计教程】Verilog 基础:硬件描述语言入门指南

目录 摘要 1. 引言 2. Verilog 历史与发展 3. Verilog 基本语法 4. Verilog 模块与端口 5. 组合逻辑与时序逻辑 6. 时钟域与同步设计 7. 测试与仿真 8. Verilog 高级特性 任务&#xff08;Tasks&#xff09; 函数&#xff08;Functions&#xff09; 多维数组 结构体…

MinGW-w64 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z

MinGW-w64 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 安装包 链接: https://pan.baidu.com/s/1G8SDlDcBtNU4TCBuLL9XYw?pwdv587 提取码: v587 是7z文件&#xff0c;解压即可&#xff0c;自动得到一个mingw64文件夹。 自存&#xff0c;应该能用

多态(虚构的整体,具体的个体)(多态的基本概念/多态的原理剖析/纯虚函数和抽象类/虚析构和纯虚析构)

多态的基本概念 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; // 多态的基本概念 // 多态分为静态多态和动态多态 // 静态多态&#xff1a; 函数重载还运算符重载属于静态多态&#xff0c;服用函数名 // 动态多态&#xff1a; 派生派和虚函…

电商走向“未来化”,“含金量”几何?

2018年&#xff0c;史蒂文斯皮尔伯格导演的《头号玩家》一经上映&#xff0c;就带火了虚拟现实概念。电影中&#xff0c;男主角戴上VR眼镜、感知手套&#xff0c;穿上触感套装&#xff0c;从视觉、听觉到触觉&#xff0c;瞬间切换至全新的世界。 电影《头号玩家》剧照 时隔六年…

如何使用ssm实现图书管理借阅系统

TOC ssm301图书管理借阅系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。…

构建在线教育系统源码:企业培训APP开发的技术指南

在数字化浪潮的推动下&#xff0c;企业培训正从传统课堂转向在线教育模式。构建一个高效、稳定且可扩展的在线教育系统源码&#xff0c;已经成为开发企业培训APP的关键。在本文中&#xff0c;我们将深入探讨构建在线教育系统源码的核心技术&#xff0c;并提供一份开发企业培训A…

免费分享一套SpringBoot+Vue个人理财管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue个人理财管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringbootVue个人理财管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入而广泛的应用&am…

记录一次polarDB出现Waiting for table metadata lock

在业务实践中&#xff0c;常见的 DDL 阻塞 原因是由于无法获取到 MDL 锁&#xff0c;即 Waiting for table metadata lock 。借助 metadata_lock 表&#xff0c;可以快速定位到 DDL 阻塞的原因。 元数据锁&#xff08;MDL&#xff09; MDL加锁过程是系统自动控制&#xff0c;无…

京东商品信息快速获取:API返回值实战教程

京东商品信息快速获取通常通过调用京东的API接口来实现&#xff0c;特别是针对商品搜索和商品详情等需求。以下是一个基于京东商品信息API返回值的实战教程&#xff0c;帮助您快速理解和利用这些API返回的数据。 1. 注册与认证 首先&#xff0c;您需要在京东开放平台&#xf…

Python爬虫的这几个实用技巧你都知道吗?

Python爬虫是一种强大的网络数据抓取工具&#xff0c;通过编写Python脚本来自动化地访问网页、提取所需信息并保存到本地。以下是Python爬虫的8大实用技巧&#xff0c;详细讲解如下&#xff1a; 1. 发送HTTP请求 基本方法&#xff1a;使用requests库发送HTTP请求是Python爬虫…