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

news2024/10/5 13:49:20

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

题目描述

        给定一个整数数组 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指向该值,不存在则返回NULL
    return 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.coloradmin.cn/o/1574615.html

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

相关文章

OPPO云VPC网络实践

1 OPPO 云网络现状 随着OPPO业务的快速发展&#xff0c;OPPO云规模增长迅速。大规模虚拟实例的弹性伸缩、低延时需求对网络提出了诸多挑战。原有基于VLAN搭建的私有网络无法解决这些问题&#xff0c;给网络运维和业务的快速上线带来了挑战。 梳理存在的主要问题如下&#xf…

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1&#xff0c; redis cluster 是什么 2&#xff0c;redis 集群的组成 3&#xff0c;集群的作用 4&#xff0c;集群架构图 二 Redis集群的数据分片 1&#xff0c;哈希槽是什么 2&#xff0c;哈希槽如何排布 3&#xff0c;Redis集…

(源码+部署+讲解)基于Springboot+vue校园设施报修系统的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f…

freeRTOS-day4

1.总结二进制信号量和计数型信号量的区别&#xff0c;以及他们的使用场景。 二进制信号量只有两个状态&#xff1a;0和1。它通常用于线程同步&#xff0c;表示某个线程执行完毕&#xff0c;另一个线程才能开始执行。这种特性使得二进制信号量特别适用于互斥访问共享资源的场景…

ensp 通过cloud连接交换,通过本机直连telnet交换机

#连接图 #cloud配置 绑定本机一个虚拟网卡&#xff0c;勾选双向通信&#xff0c;这样就可以通过真机直接telent到交换机 #交换机配置 #需要将管理口ip配置为绑定的虚拟网卡同网段的IP&#xff0c;便于直接链接 system-view sysname s5700 undo info-center en telnet server…

HTTP 常见的状态码以及其适用场景

是什么 HTTP状态码&#xff08;英语&#xff1a;HTTP Status Code&#xff09;&#xff0c;用以表示网页服务器超文本传输协议响应状态的3位数字代码 它由 RFC 2616规范定义的&#xff0c;并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774与 RFC 4918等规范扩展 简单来讲&#…

什么是网络行为监控审计

网络行为监控审计&#xff0c;顾名思义&#xff0c;是指对网络使用者的行为进行实时监控&#xff0c;并对这些行为进行详细记录和审计的过程。 它涉及到对网络流量、用户操作、数据访问等多个方面的监控&#xff0c;旨在发现潜在的安全威胁和违规行为&#xff0c;从而保障网络…

视听杂志知网收录期刊投稿发表论文

《视听》是由国家新闻出版总署批准的正规的&#xff0c;兼有新闻传播、新媒体理论探索的当代学术性省级综合期刊。坚持正确的理论导向&#xff0c;全面展示广播影视事业发展中出现的新情况、新事物&#xff0c;探索现代传媒基础理论&#xff0c;研究网络传播、通讯传播等新媒体…

职场中持续加班的原因、影响及应对策略

在当今竞争激烈的职场环境中&#xff0c;加班已经成为许多行业的常态。本文将探讨持续加班的原因、对员工和企业的负面影响&#xff0c;以及应对持续加班的策略。 一、持续加班的原因 1. 工作任务繁重&#xff1a;在许多企业中&#xff0c;工作任务量过大&#xff0c;员工为了完…

Sora的阅读技术报告

sora的技术报告 走进sorasora的特性sora的介绍sora的实际操作sora的发展安全措施研究技术 走进sora 大家好&#xff0c;我是清风之上。随着人工智能的发展&#xff0c;慢慢的他已经出现在我们生活中的各个角落&#xff0c;其中有API推出的sora&#xff0c;让我们震惊不已&…

Linux多进程通信(4)——消息队列从入门到实战!

Linux多进程通信总结——进程间通信看这一篇足够啦&#xff01; 1.基本介绍 1&#xff09;消息队列的本质其实是一个内核提供的链表&#xff0c;内核基于这个链表&#xff0c;实现了一个数据结构&#xff0c;向消息队列中写数据&#xff0c;实际上是向这个数据结构中插入一个…

页面转word的那些事

背景 有些时候需要将页面内容或者是页面的数据通过word进行下载&#xff0c;以方便客户进行二次编辑&#xff0c;而不是直接导出图片或者是pdf。 想在页面端点击下载成word&#xff0c;那必然需要服务端来进行读写文件&#xff0c;无论是你后端编辑好的内容流&#xff0c;还是…

MySQL如何创建存储过程

工作中有时候需要自己去创建存储过程&#xff0c;然后调用存储去获得一些数据等&#xff0c;接下来就给大家介绍下MySQL如何创建存储过程。 语法&#xff1a; CREATE PROCEDURE 存储程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过…

git生成ssh key并推送到远端仓库

ssh-keygen -t rsa -C "anarckkgmail.com"在用户文件夹中找到id_rsa.pub&#xff0c;把内容复制到gitea的配置里&#xff0c;然后直接用git推送就可以了

HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经学习完了超链接标签、列表标签和表格标签&#xff0c;但是我们还有一些标签没有学习&#xff0c;在这篇文章中&#xff0c;我们将学习剩余的标签。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页…

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典遗传算法&#xff08;GA&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码片段参…

前端零基础学习web3开发

目录 1 钱包 2 发起交易 3 出块 4 块高 5 矿工 6 Gas费 这一节&#xff0c;我们不说让人神往的比特币&#xff0c;不说自己会不会利用这个虚拟的货币来发财&#xff0c;也不说那些模模糊糊的知识&#xff0c;什么去中心化啦&#xff0c;什么奇妙的加密啦&#xff0c;我们…

深入浅出 -- 系统架构之负载均衡Nginx缓存机制

一、Nginx缓存机制 对于性能优化而言&#xff0c;缓存是一种能够大幅度提升性能的方案&#xff0c;因此几乎可以在各处都能看见缓存&#xff0c;如客户端缓存、代理缓存、服务器缓存等等&#xff0c;Nginx的缓存则属于代理缓存的一种。对于整个系统而言&#xff0c;加入缓存带来…

1.8.4 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v2 和Inception-v3

1.8.4 卷积神经网络近年来在结构设计上的主要发展和变迁——Inception-v2 和Inception-v3 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet 1.8.3 卷积神经网络近年来…

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置 SQLAlchemy官方文档地址实战的代码分享数据类型列约束配置自定义方法 SQLAlchemy官方文档地址 SQLAlchemy官方文档地址 实战的代码分享 Flask-SQLAlchemy框架为创建数据库的实例提供了一个基类…