【算法】两数之和(暴力求解+哈希表)

本题来源---《两数之和》。

题目描述

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

叫我们一起来看看本道题怎么解决吧!

        解法一:暴力求解

        解法二:哈希表

解法一:暴力求解

        通过枚举数组中的每一个数 x,寻找数组中是否存在 target - x。主要就是用for循环遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。

代码如下:

int* twoSum(int* nums, int numsSize, int target, int* returnSize) 
{int       i,j;for(i = 0; i < numsSize; i++){for(j = i+1; j < numsSize; j++){if(nums[i] + nums[j] == target)    //满足条件{*returnSize = 2;int *array = (int *)malloc(sizeof(int)*2);array[0] = i;array[1] = j;return array;}}}*returnSize = 0;return NULL;
}

        这里容易被误解的地方我个人认为是传入参数的意义。
        (1)*nums:即题中给定的整数数组,
        (2)numSize:即该整数数组大小,
        (3)target:即给定的整数目标值,
        (4)*returnSize:即所要返回数组的大小。

复杂度分析

  1. 时间复杂度:O(N^2),其中 N是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。

  2. 空间复杂度:O(1)。

解法二:哈希表

图解:(参考示例 2)

共三步:

  1. 算出当前数字和目标数字(target)的差值
  2. 检查哈希表中是否存在该差值,存在就返回该结果。
  3. 不存在,当前数字作为key,索引作为value存入哈希表

代码如下: 

struct hashTable    //定义哈希表
{int             key;int             val;UT_hash_handle  hh;
};              struct hashTable*       hashtable;struct hashTable*    find(int ikey)
{struct hashTable*    tmp;HASH_FIND_INT(hashtable,&ikey,tmp);    //查看hashtable中是否存在ikey值,存在则返回tmp指向该值,不存在则返回NULLreturn tmp;
}void insert(int ikey,int ival){struct hashTable*   tmp = malloc(sizeof(struct hashTable));tmp->key = ikey;tmp->val = ival;HASH_ADD_INT(hashtable,key,tmp); //哈希表不存在ikey值,将ikey作为key,ival作为val存入哈希}int* twoSum(int* nums, int numsSize, int target, int* returnSize) 
{int      i;hashtable = NULL;for(i = 0; i < numsSize; i++){struct hashTable*    it = find(target-nums[i]);    //检查哈希表中是否存在该差值if(it != NULL)    //哈希表中存在该差值{int*    ret = malloc(sizeof(int)*2);ret[0] = it->val;ret[1] = i;*returnSize = 2;return ret;}insert(nums[i],i);    //哈希表中不存在该差值,当前数字作为key,索引作为value存入哈希表}*returnSize = 0;return NULL;
}

复杂度分析

  1. 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1)地寻找 target - x

  2. 空间复杂度:O(N),其中 N是数组中的元素数量。主要为哈希表的开销。

        第一次做算法题,有很多不足与欠缺,欢迎大家与我讨论!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恶意代码的多种形式

恶意代码是一种程序代码有害的计算机代码或 web 脚本&#xff0c;其设计目的是创建系统漏洞&#xff0c;并借以造成后门、安全隐患、信息和数据盗窃、以及其他对文件和计算机系统的潜在破坏。为了防范恶意代码的攻击&#xff0c;我们可以采取一系列措施。德迅云安全-代码审计可…

深度学习理论基础(七)Transformer编码器和解码器

目录 前述&#xff1a; Transformer总体结构框图一、编码器encoder1. 编码器作用2. 编码器部分&#xff08;1&#xff09;单个编码器层代码&#xff08;2&#xff09;编码器总体代码 二、解码器decoder1. 解码器作用2. 解码器部分&#xff08;1&#xff09;单个解码器层代码&am…

纯CSS实现未读消息显示99+

在大佬那看到这个小技巧&#xff0c;我觉得这个功能点还挺常用&#xff0c;所以给大家分享下具体的实现。当未读消息数小于100的时候显示准确数值&#xff0c;大于99的时候显示99。 1. 实现效果 2. 组件封装 <template><span class"col"><sup :styl…

JavaEE 初阶篇-深入了解线程池(线程池创建、线程池如何处理任务)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 线程池概述 1.1 线程池的优点 1.2 不使用线程池的问题 1.3 线程池的工作原理图 1.4 如何创建线程池&#xff1f; 2.0 通过 ThreadPoolExecutor 类自定义创建线程…

基于springboot+vue的地方美食分享网站(全套资料)

一、系统架构 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 用户端-登录 02. 用户端-首页 03. 用户端-外国美食 04. 用户端-中式美食 05. 用户端-热…

Centos7使用docker安装Jenkins(含pipeline脚本语句)

一、下载Jenkins docker pull jenkins/jenkins:lts 二、启动Jenkins docker run \-u root \--rm \-d \-p 8081:8080 \-p 50000:50000 \-v /root/docker/jenkins/var/jenkins_home:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr…

2024.4.4-day09-CSS 布局模型(标准流模型、浮动模型)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.4-学习笔记1 CSS 布局模型1.1 标准流1.2 CSS 浮动1.3 去除塌陷 2…

记Postman参数化

因为需要在WEB页面上处理部分数据&#xff0c;手动操作太慢&#xff0c;所以考虑使用接口方式处理&#xff0c;因急于使用&#xff0c;用Python Request的方式&#xff0c;写代码也来得慢&#xff0c;故采用Postman加外部文件参数化方式来实现。 接口请求是Post方式&#xff0c…

光伏接口转接器配合光伏规约转换器实现发电用电信息采集支持接入各个型号逆变器

1.产品概述 DAQ-GP-485PIA光伏接口转接器&#xff08;以下简称转接器&#xff09;是我公司针对光伏发电领域国家电网公司最新需求设计的&#xff0c;光伏接口转接器是配合光伏规约转换器&#xff0c;实现逆变器发电、用电信息采集的设备。支持锦浪、古瑞瓦特、固德威、华为、奥…

115.不同的子序列

给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s "rabbbit", t "rabbit" 输出&#xff1a;3 解释&#xff1a; 如下所示, 有 3 种可以从 s 中…

[AI in sec]-039 DNS隐蔽信道的检测-特征构建

DNS隐蔽信道是什么 DCC是指利用DNS数据包中的可定义字段秘密传递信息的通道。其中,“DNS 协议”是目前网络上使用的标准域名解析协议;“可定义字段”是DNS 数据包中的 QNAME 字段、RDATA 字段及RawUDP字段。利用DNS数据包可以构建2种信道:存储信道及时间信道。DCC可以被用于…