当前位置: 首页 > news >正文

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

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

题目描述

        给定一个整数数组 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是数组中的元素数量。主要为哈希表的开销。

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

相关文章:

  • 用tkinter来实现扫雷游戏
  • usb_camera传输视频流编码的问题记录!
  • Elasticsearch 聚合函数返回空数组|查询返回空内容 rs里有数据
  • 海康Ehome2.0与5.0设备接入EasyCVR视频汇聚平台时的配置区别
  • 穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地
  • webpack环境配置分类结合vue使用
  • 蓝桥杯算法题:最大比例
  • 金融企业区域集中库的设计构想和测试验证
  • kubeadm部署的k8s1.29集群证书更新
  • 微信小程序中实现埋点的方法
  • flink1.18源码本地调试环境
  • 如何操作RAID 0阵列的扩容?
  • MongoDB初探:安装与图形化界面保姆级使用指南
  • 面试算法-132-和至少为 K 的最短子数组
  • 迷茫下是自我提升
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Elasticsearch 参考指南(升级前重新索引)
  • Git的一些常用操作
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript创建对象的四种方式
  • JavaWeb(学习笔记二)
  • Laravel 实践之路: 数据库迁移与数据填充
  • Otto开发初探——微服务依赖管理新利器
  • vue 个人积累(使用工具,组件)
  • web标准化(下)
  • 分类模型——Logistics Regression
  • 分享一份非常强势的Android面试题
  • 计算机常识 - 收藏集 - 掘金
  • 力扣(LeetCode)22
  • 如何解决微信端直接跳WAP端
  • 微服务入门【系列视频课程】
  • 正则表达式-基础知识Review
  • ​水经微图Web1.5.0版即将上线
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ###C语言程序设计-----C语言学习(3)#
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (过滤器)Filter和(监听器)listener
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (轉)JSON.stringify 语法实例讲解
  • .net wcf memory gates checking failed
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET6实现破解Modbus poll点表配置文件
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net生成的类,跨工程调用显示注释