LeetCode 热题 100 - 第1题:两数之和

news2024/9/22 17:29:00

LeetCode 热题 100 - 第1题:两数之和

  • 原题
  • 题目理解
  • 普通的解题思路---遍历查找
  • 进阶的解题思路---哈希查找

原题

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

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

题目理解

这个题目有几个关键点:

  1. 计算仅限于整数
  2. 只会存在一个有效答案------找到一组答案就可以退出程序
  3. 数组里同一个元素在答案里不能重复出现------数组里的元素不能自己和自己相加
  4. 限定了nums[i], nums.length, target的值的范围------32位整形数就不会溢出

普通的解题思路—遍历查找

穷举法,为每个元素num[i]去遍历数组里除自己外的所有元素查找是否存在 num[j] = target−num[i]找到则返回。这个算法的时间复杂度是O(N2)。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i;
    int j; 

    for(i = 0; i < numsSize; i++)
    {
        for(j = i + 1; j < numsSize; j++)
        {
            if (nums[i] + nums[j] == target)
            {
                int* result = malloc(sizeof(int) * 2);
                result[0] = i;
                result[1] = j;
                *returnSize = 2;
                return result;
            }
        }
    }
    
    *returnSize = 0;
    return NULL;
}

结果:
结果很一般,只是达到了能用的层次。
在这里插入图片描述

进阶的解题思路—哈希查找

leetcode是用来考算法的,所以我们要明白,这里需要的进阶的解题思路不是在原有的代码做代码级的优化,而是要求做算法级的优化。我们正常的解题思路下:针对数组里的N个数字,给每一个数字去便历查找所有N-1个数字看N-1里哪个数字等于我们要查找的数,所以总体上来讲,在最差情况下每个数都要和除它自己之外的所有数据做过比较,所以要做N*N-1次查找,实际上因为我们只比较当前数和排在它后面的数,因为排在它前面的数,已经在之前的数字和其它数比较时比较过了,不需要重复比较,所以是N*(N-1)/2次,总体上来说时间复杂度是O(N2)。
这里我们需要一个新的算法,目标是将时间复杂度降低到O(N)。学过数据结构的我们都知道哈希表用于查找时,相比于遍历法,可以将查找N个数字的次数从N降低到1(不考虑散列计算和假设不会产生不需要解决散列冲突需要的额外时间的前提下,哈希表的查找是直接命中需要查找的数或者直接返回找不到的),所以自然而然就可以想到用哈希表来解决这个问题,思路也很简洁:
遍历N个数字,当遍历到第n个数字(假设第n个数字的值为n_value)时,就去查找哈希表中有没有等于target-n_value的数,如果有,则返回n和哈希表中的数字在数组中的下标),如果没有,则将当前数的值做为key, 下标做为value存入哈希表。
那么这时需要比较的次数就降低为N*1次,所以总体上来说时间复杂度就降低到是O(N)了。

**
 * Note: The returned array must be malloced, assume caller calls free().
 */

 struct hashTable 
 {
    int key;
    int value;
    UT_hash_handle hh;
};

struct hashTable* hashtable;

struct hashTable* find_node(int key) 
{
    struct hashTable* node;
    HASH_FIND_INT(hashtable, &key, node);
    return node;
}

void insert_node(int key, int value) 
{
    struct hashTable* node = malloc(sizeof(struct hashTable));
    node->key = key, node->value = value;
    HASH_ADD_INT(hashtable, key, node);

}



int* twoSum(int* nums, int numsSize, int target, int* returnSize){

    hashtable = NULL;
    
    for (int i = 0; i < numsSize; i++) 
    {
        struct hashTable* node = find_node(target - nums[i]);
        if (node != NULL) 
        {
            int* result = malloc(sizeof(int) * 2);
            result[0] = node->value;
            result[1] = i;
            *returnSize = 2;
            return result;
        }
        else
        {
            insert_node(nums[i], i);
        }
        
    }

    *returnSize = 0;
    return NULL;

}

结果:
以空间换时间,达到了速度极快的层次。
在这里插入图片描述

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

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

相关文章

Docker 镜像常用命令总结

目录 1. Docker镜像相关命令(重点掌握) 1.1 docker pull 镜像名称 [:tag] 拉取镜像 1.2 docker search 镜向名称 (查询某个镜像) 1.3 docker images 列出当前主机上所有镜像 1.4 docker rmi 镜像ID 删除镜像 1.5 docker system df 查看所有镜像容器所占空间 2. Docker …

每日一练——快速合并2个有序数组

每日一练来喽~~~ 今天up主为大家分享一个&#xff0c;快速合并2个有序数组的法子&#xff0c;注意听哟&#xff01; 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数…

2、TB6600驱动器介绍【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍TB6600驱动器界面及关键参数设置 一、驱动器功能界面 二、关键参数 输入电压&#xff1a;DC9-42V 输出电流&#xff1a;0.5-4A 最大功耗&#xff1a;160W 细分设置&#xff1a;1,2/A,2/B,4,8,16,32 工作温度&#xff1a;-10~45C 信号口驱动电流&…

用ST-LINK 出现连接失败【已解决】

出现的问题&#xff1a;not connect to target! 13:33:39 : Can not connect to target! Please select "Connect Under Reset" mode from Target->Settings menu and try again. If youre trying to connect to a low frequ…

【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;谈谈CopyOnWriteArrayLi…

FlutterUnit 周边 | 收录排序算法可视化

theme: cyanosis 1. FlutterUnit 更新&#xff1a;排序算法可视化 排序算法可视化是用视图层表现出算法执行过程中排序的过程&#xff0c;感谢 编程的平行世界 在 《十几种排序算法的可视化效果&#xff0c;快来看看&#xff01;&#x1f440;》》 一文中提供的算法支持。我进行…

【Proteus仿真】【Arduino单片机】继电器和按键

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用蜂鸣器、按键、继电器、电机等。 主要功能&#xff1a; 系统运行后&#xff0c;K1键控制蜂鸣器发声&#xff0c;K2键控制LED开关&#xff0c;…

计算机图形学——二维变换

二维变换 概念 应用于对象几何描述并改变其位置、方向或者大小的变换叫做几何变换&#xff0c;有时候也被叫做建模变换。而本文仅讨论平面中的几何变换&#xff0c;即二维变换。 矩阵表示和齐次坐标 对于普通的2x2矩阵&#xff0c;我们总是要将平移项与其它变换对应的矩阵写…

MYSQL表的连接方式

mysql表连接方式可以分为 1、内连接 2、外连接 3、全连接 4、交叉连接 t1表 t2表 1、内连接&#xff0c;包括自然连接&#xff0c;等值连接&#xff0c;不等值连接 1.1、自然连接&#xff0c;根据相同字段进行连接匹配…

容联七陌百度营销通BCP解决方案,让营销更精准

百度营销通作为一个快速迭代、满足客户多元化营销需求的高效率营销工具成为众多企业的选择&#xff0c;通过百度营销通BCP对接&#xff0c;企业就可以在百度咨询页接入会话&#xff0c;收集百度来源的访客搜索关键词&#xff0c;通过百度推广获取更多的精准客户&#xff0c;从而…

基于JAVA的天猫商场系统设计与实现,springboot+jsp,MySQL数据库,前台用户+后台管理,完美运行,有一万五千字论文

目录 演示视频 基本介绍 论文目录 系统截图 演示视频 基本介绍 基于JAVA的天猫商场系统设计与实现&#xff0c;springbootjsp&#xff0c;MySQL数据库&#xff0c;前台用户后台管理&#xff0c;完美运行&#xff0c;有一万五千字论文。 本系统在HTML和CSS的基础上&#xf…

计算机起源(二)

一、前言 冯诺依曼奠定了计算机体系结构后&#xff0c;早期的计算机是没有操作系统的&#xff0c;还是需要大量的人为参与&#xff0c;比如纸卡打孔。通过纸卡上的方格&#xff0c;打孔来表示二进制数。那么如果能使计算机自动能够进行计算&#xff0c;就需要一个模拟人工的操…

Node学习笔记之使用Express框架开发接口

我们利用nodeexpressmysql开发接口&#xff0c;对数据库数据进行简单增、删、查改等操作。 工具 数据库可视化 接口测试工具Postman 1、初始化 我们这里利用nodeexpressmysql开发一个简单的书城商店API。后面会使用result API规范接口 1、创建项目 新建文件夹server 安装依…

记:2023香山杯-Ez加密器-题目复现和学习记录““

文章目录 前言题目分析and调试过程完整exp 前言 前段时间的比赛&#xff0c;那会刚入门o(╥﹏╥)o都不会写&#xff0c;现在复现一下。 题目分析and调试过程 查壳nie 进入IDA&#xff0c;shiftF12查找下字符串看看&#xff0c;定位过去 先用N重命名一下函数&#xff0c;方便…

GPDB7-新特性-角色创建

GPDB7-新特性-角色创建 9月GPDB7发布了release版本&#xff0c;新增了很多新特性及性能改进&#xff0c;对GPDB用户带来福音。业务在调研GPDB6升级到GPDB7的过程中&#xff0c;生产环境会创建用户&#xff0c;利用这些用户进行迁移。但是出现问题了&#xff0c;竟然会报&#x…

如何使用Linux编写STM32程序并且烧录

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff08;2&#xff0…

Z41H-64C高压闸阀型号解析

Z41H-64C型号字母含义 Z41H-64C型号是德特森阀门常用的高压闸阀型号字母分别代表的意思是: Z——代表阀门类别《闸阀》 4——代表连接方式《法兰》 1——代表结构形式《明杆》 H——代表密封堆焊《硬质合金》 -《分隔键》 64——代表公称压力《6.4MPA》 C——代表阀体材…

RT-Thread 6. ENV增加组件(从服务器下载得到)

键入“Y”、或者空格选中 保存 保存之后&#xff0c;自动修改这个文件 退回到ENV界面&#xff0c;输入&#xff1a;pkgs --update 多了 如果用keil4编译的话&#xff0c;输入&#xff1a;scons --targetmdk4&#xff0c;重新生成keil4工程&#xff0c;双击“project.uvpro…

10-类加载器

类加载器 类与类加载器 判断类是否“相等” 任意一个类&#xff0c;都由加载它的类加载器和这个类本身一同确立其在 Java 虚拟机中的唯一性&#xff0c;每一个类加载器&#xff0c;都有一个独立的类名称空间。 因此&#xff0c;比较两个类是否“相等”&#xff0c;只有在这…

北邮22级信通院数电:Verilog-FPGA(6)第六周实验:全加器(关注我的uu们加群咯~)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 作者建群啦&#xff01;&#xff01;&#xff01;欢…