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

力扣|找出和所对应的两数的下标

从零开始刷力扣(bushi

题目放在这:

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

只会存在一个有效答案

放一个分割线在这:


我自己也是C语言复建,没有系统学习过数据结构,所以第一反应真就是暴力破解(见笑了)

也就是依次将数组的两个元素相加,和目标数做对比

因为只有一个有效答案,那么就可以在检索到和等于目标数数,直接输出对应的坐标

如果遍历结束没有得到结果,则输出NULL

借一下leecode的标准答案,这边我自己加上了前期的输入输出语句,这样方便看到结果:

#include <stdio.h>
#include <stdlib.h>int *twoSum(int *nums, int numsSize, int target, int *returnSize);int main() {int *p, *returnSize;int nums[10];int numsSize = 0, target = 0;*returnSize = 2;printf("找出数组中和为目标数的两个元素的下标:\n请输入数组的长度(不超过十)\n");scanf("%d", &numsSize);printf("请输入数组的内容,并用回车分隔\n");for (int i = 0; i < numsSize; i++) {scanf("%d", &nums[i]);}printf("您输入的数组内容为:nums[]=");for (int i = 0; i < numsSize; i++) {printf("%d ", nums[i]);}printf("请输入您的目标数:\n");scanf("%d", &target);p = twoSum(nums, numsSize, target, returnSize);if (p != NULL) {printf("您的目标数对应的坐标下标为:");printf("%d ", p[0]);printf("%d", p[1]);} elseprintf("您的目标数不能被数组中的任何两个数相加得到。");return 0;
}int *twoSum(int *nums, int numsSize, int target, int *returnSize) {for (int i = 0; i < numsSize; ++i) {for (int j = i + 1; j < numsSize; ++j) {if (nums[i] + nums[j] == target) {int *ret = (int *)malloc(sizeof(int) * 2);ret[0] = i, ret[1] = j;*returnSize = 2;return ret;}}}*returnSize = 0;return NULL;
}

 简单讲一点:

1、<stdio.h>头文件,翻译为standard input output

程序中用到的scanf、printf,都需要使用标准的输入输出库

2、<stdlib.h>头文件,和存储、空间分配密切相关的一个函数

程序中用到的malloc函数,用来分配内存空间,出自于这个头文件

类似的还有calloc、free、realloc函数等,感兴趣的可以看一看

3、malloc函数:

函数原型:void * malloc(unsigned size);

功能是分配size字节的存储区。程序中需要两个int的空间所以乘2

默认的类型是void*,由于我设定了ret为int*类型,所以这里强制类型转换为int*

(leecode标准答案是没有这个强制转换的,其实我也有印象这一步可以自动转换,但是我用的Dev C++报错)

再放一个分割线:


那么肯定不可能就到此为止了,在今年校招(2024届校招)中,不知道大家有没有关注腾讯的招聘,直播间提到的就是这个问题。

不过大佬显然指的是用哈希表

什么是哈希表?

哈希表是一种数据结构,提供了快速的插入操作和查找操作

不管哈希表有多少数据,插入和查找的时间复杂度都是O(1),查找速度非常快

不过,哈希表基于数组,一旦数组被填满,性能就大不如前。

关于哈希表,推荐一个视频:

『教程』哈希表是个啥?_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1qR4y1V7g6/?spm_id_from=333.337.search-card.all.click&vd_source=86629babf8e8eb6ebc7b7475ab3f61a2简单理解为:用时间换空间

先放代码(后面有详细解释,这里方便想自学的大佬):

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);return tmp;
}void insert(int ikey, int ival) {struct hashTable* it = find(ikey);if (it == NULL) {struct hashTable* tmp = malloc(sizeof(struct hashTable));tmp->key = ikey, tmp->val = ival;HASH_ADD_INT(hashtable, key, tmp);} else {it->val = ival;}
}int* twoSum(int* nums, int numsSize, int target, int* returnSize) {hashtable = NULL;for (int 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);}*returnSize = 0;return NULL;
}

然后咱们就来详细解释这个代码。

已知,用哈希表查询,首先将要查找的东西作为参数进入一个函数,得到一个确定的数字

该数字就是哈希表中,查询结果的地址。

这样,本来我们需要一个个查询、比较的,现在只需要经过一次函数计算,一次查找。

将目光回到代码上:

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);return tmp;
}

建立一个哈希表的指针,并且设置一个寻找函数

输入参数是我们要找的结果,并内置了HASH_FIND_INT函数

这个是头文件中包含的函数,主要参数有三个,

第一个就当默认参数,第二个是要找的值,第三个是哈希表的指针(做返回值用)

该函数的意义是:

找到ikey对应的值,如果哈希表中没有,tmp=NULL

如果找到了对应的值,tmp的第一个值为ikey,第二个是ikey对应的哈希表的val

简单来说就是一个查询操作,如果没有返回NULL,如果有返回对应的数值和位置

void insert(int ikey, int ival) {struct hashTable* it = find(ikey);if (it == NULL) {struct hashTable* tmp = malloc(sizeof(struct hashTable));tmp->key = ikey, tmp->val = ival;HASH_ADD_INT(hashtable, key, tmp);} else {it->val = ival;}
}

定义一个插入函数

find函数就是我们上面提到的寻找函数,会返回一个哈希表的指针,

如果返回的指针为NULL,也就是哈希表中没有我们要找的值,会再次定义一个分配了一个哈希表空间的指针tmp,并将对应的数值,以及数值在原本数组中的数值赋值给新建的哈希表

运用HASH_ADD_INT函数将这个新建的数据增加到哈希表中

如果返回的指针有数值,也就是哈希表中已经存在对应的结果了,找到了,那就更方便,直接记录

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {hashtable = NULL;for (int 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);}*returnSize = 0;return NULL;
}

这是函数的主体

按照原始数组的顺序循环,依次查找target-nums[i]的结果,刚开始都是向哈希表内添加数,直到找到对应的结果

因为这里假设只存在唯一解,所以就没有必要考虑多种情况

简单画一个执行的逻辑吧:
 

 

相关文章:

力扣|找出和所对应的两数的下标

从零开始刷力扣&#xff08;bushi 题目放在这&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…...

使用命令行创建仓库

如果你还没有任何代码&#xff0c;可以通过命令行工具创建一个全新的Git仓库并初始化到本项目仓库中。 git clone https://e.coding.net/***/neurosens.git cd neurosens echo "# neurosens" >> README.md git add README.md git commit -m "first commi…...

ESLint 中的“ space-before-function-paren ”相关报错及其解决方案

ESLint 中的“ space-before-function-paren ”相关报错及其解决方案 出现的问题及其报错&#xff1a; 在 VScode 中&#xff0c;在使用带有 ESLint 工具的项目中&#xff0c;保存会发现报错&#xff0c;并且修改好代码格式后&#xff0c;保存会发现代码格式依然出现问题&…...

docker常用中间件安装

文章目录 1、前言2、中间件安装2.1、mysql2.2、gitlab容器2.3、nacos2.4、redis2.5、xxljob2.6、zipkin2.7、sentinel2.8、seata2.8.1、获取镜像2.8.2、运行容器并获取配置 2.9、rockerMQ2.9.1、rockerMQ-namesrv2.9.2、rockerMQ-broker2.9.3、rockerMQ-console 2.10、jenkins2…...

Camunda 7.x 系列【44】修改流程实例

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 案例演示2.1 回退2.2 子流程2.3 多实例加签1. 概述 流程模型中,执行活动需要按…...

无频闪护眼灯哪个好?什么是无频闪

随着科技的不断发展&#xff0c;工作时使用电子设备越来越普遍,如何保护我们的眼睛不受蓝光、频闪等危害就变得极其重要了。护眼台灯&#xff0c;顾名思义就是保护眼睛的台灯&#xff0c;其工作原理是在光源处使用特殊的防蓝光灯珠&#xff0c;并通过控制电流的稳定性来达到防频…...

css网格布局

css网格布局 常用属性 display: grid; //开启网格grid-template-columns: 2fr 1fr 1fr 1fr 1fr; //设置多少列每列宽度grid-gap: 10px; // 设置表格之间间距grid-template-rows: 50px 50px 50px 50px; // 设置多少行 每行的高度grid-column : 1 //占据位置 占据1格grid-colu…...

Hadoop -HDFS常用操作指令

1.启动HDFS hadoop/sbin/start-dfs.sh2.关闭 HDFS hadoop/sbin/stop-dfs.sh3. 在HDFS中创建文件夹 #老版本 hadoop fs -mkdir -p path #新版本 hadoop dfs -mkdir -p path4.查看指定目录下内容 hadoop fs -ls [-h] [-R] path hadoop dfs -ls [-h] [-R] ptahpath 指定…...

代码随想录二刷day11

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣20. 有效的括号二、力扣1047. 删除字符串中的所有相邻重复项三、力扣150. 逆波兰表达式求值 前言 一、力扣20. 有效的括号 class Solution {public bo…...

系统架构技能之设计模式-工厂模式

一、开篇 本文主要是讲述设计模式中最经典的创建型模式-工厂模式&#xff0c;本文将会从以下几点对工厂模式进行阐述。 本文将会从上面的四个方面进行详细的讲解和说明&#xff0c;当然会的朋友可以之处我的不足之处&#xff0c;不会的朋友也请我们能够相互学习讨论。 二、摘…...

Docker的基本组成和安装

Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a; docker镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;tomcat镜像 > run > tomcat01容器&#xff08;提供服务&#xff09; 通过这个镜像可以创建多个容器&#xff08;最…...

【python爬虫】15.Scrapy框架实战(热门职位爬取)

文章目录 前言明确目标分析过程企业排行榜的公司信息公司详情页面的招聘信息 代码实现创建项目定义item 创建和编写爬虫文件存储文件修改设置 代码实操总结 前言 上一关&#xff0c;我们学习了Scrapy框架&#xff0c;知道了Scrapy爬虫公司的结构和工作原理。 在Scrapy爬虫公司…...

Apinto 网关 V0.14 版本发布,6 大插件更新!

大家好&#xff01; 距离上次更新已经过去一段时间了&#xff0c;这段日子里我们一直在酝酿新的功能&#xff0c;本次的迭代将给大家带来 6 大插件的更新~一起来看看有哪些变化吧&#xff01; 新特性 1. 新增 额外参数v2 插件&#xff0c;支持对转发参数进行加密、拼接等操作…...

突破销售瓶颈:亚马逊卖家如何借力TikTok网红营销?

随着社交媒体的崛起&#xff0c;营销方式也在不断变革。TikTok作为一款风靡全球的短视频平台&#xff0c;吸引了数以亿计的用户&#xff0c;成为了品牌宣传和销售的新热点。对于亚马逊卖家而言&#xff0c;通过合理运用TikTok网红营销策略&#xff0c;可以有效提升产品的曝光度…...

JavaWeb之Cookie的简单使用!!!

什么是Cookie Cookie:客户端会话技术&#xff0c;将数据保存到客户端&#xff0c;以后每次请求都携带Cookie数据进行访问 Cookie 数据存放在浏览器端(客户端) 创建Cookie 1.创建Cookie Cookie cookie new Cookie("key","value"); 2.使用response响应…...

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Apache Hive示例(6)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

6.Redis-hash

hash 哈希类型中的映射关系通常称为field-value&#xff0c;⽤于区分 Redis 整体的键值对&#xff08;key-value&#xff09;&#xff0c;注意这⾥的value是指field对应的值&#xff0c;不是键&#xff08;key&#xff09;对应的值&#xff0c;请注意 value 在不同上下⽂的作⽤…...

点云从入门到精通技术详解100篇-多时相机载激光雷达人工林点云匹配及生长监测(续)

目录 多时相机载激光雷达人工林点云匹配及变化监测 3.1 技术路线 3.2 数据准备 3.3 方法...

【Vue3 知识第七讲】reactive、shallowReactive、toRef、toRefs 等系列方法应用与对比

文章目录 一、reactive()二、readonly()三、shallowReactive()四、shallowReadonly()五、isReactive() 和 isReadonly()六、toRef()七、toRefs()八、toRaw()九、ref、toRef、toRefs 异同点 一、reactive() reactive() 函数用于返回一个对象的响应式代理。与 ref() 函数定义响应…...

Docker 摸门级简易手册

Docker 摸门级简易手册 文章目录 Docker 摸门级简易手册使用 Docker 构建 Java 项目镜像Docker 安装Install on MacInstall on WindowsInstall on Linux Dockerfile 说明FROMLABELENVWORKDIRCOPYADDRUNCMDEXPOSEENTRYPOINTVOLUMEUSER 使用 Docker 构建 Java 项目镜像 假设有个…...

泛微Ecology流程数据查询避坑指南:workflow_currentoperator表里isremark字段到底怎么用?

泛微Ecology流程数据查询实战&#xff1a;解密workflow_currentoperator表关键字段 在泛微Ecology系统的二次开发过程中&#xff0c;流程数据的精准查询往往是开发者面临的第一道门槛。特别是当需要对接第三方系统或构建定制化报表时&#xff0c;对workflow_currentoperator表中…...

Pixel Fashion Atelier部署教程:Stable Diffusion像素时装生成工作站保姆级安装指南

Pixel Fashion Atelier部署教程&#xff1a;Stable Diffusion像素时装生成工作站保姆级安装指南 1. 项目介绍 Pixel Fashion Atelier&#xff08;像素时装锻造坊&#xff09;是一款基于Stable Diffusion与Anything-v5模型的图像生成工作站。与传统AI工具不同&#xff0c;它采…...

手把手教你魔改YOLOv8:从CSPPC到SPPELAN的实战调优(新手友好版)

1. 为什么需要魔改YOLOv8&#xff1f; 目标检测是计算机视觉领域最基础也最实用的技术之一&#xff0c;而YOLOv8作为当前最流行的实时检测框架&#xff0c;凭借其出色的速度和精度平衡&#xff0c;已经成为工业界和学术界的首选。但在实际项目中&#xff0c;我们经常会遇到一些…...

基于Vue的沧交食堂食品监管系统[vue]-计算机毕业设计源码+LW文档

摘要&#xff1a;本文阐述了一个基于Vue框架开发的沧交食堂食品监管系统。该系统旨在借助现代Web技术&#xff0c;强化对沧交食堂食品安全的监管力度&#xff0c;提升监管效率与质量。系统涵盖了系统用户管理、新闻数据管理、食品相关业务管理以及评论管理等多方面功能。文章详…...

告别手动建模!用Blender GIS插件5分钟搞定CARLA地图(附OSM数据源)

告别手动建模&#xff01;用Blender GIS插件5分钟搞定CARLA地图&#xff08;附OSM数据源&#xff09; 在自动驾驶仿真领域&#xff0c;快速构建高精度地图一直是开发者的痛点。传统手动建模方式不仅耗时费力&#xff0c;还难以保证道路网络的拓扑准确性。现在&#xff0c;通过…...

dfs:飞机降落

题目&#xff1a;P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 做题目之前一定要先看数据范围。这道题的数据范围&#xff0c;T,N均<10&#xff0c;可以用暴力搜索。 这道题是排序&#xff0c;假设有3辆飞机。顺序可以是123&#xff0c;132&#xff0c;213&#xff0c;231&am…...

什么时候会触发FullGC

面试 1、老年代空间不足。应该让对象在年轻代多存活一段时间&#xff0c;不要创建过大的对象及数组。 2、元空间满了。说明此时&#xff0c;系统中要加载的类、反射的类和调用的方法较多。 3、MinorGC执行后晋升到老年代的平均大小大于老年代的剩余空间。...

RK3128安卓5.1系统APK签名全流程:从signapk.jar到platform.pk8的保姆级教程

RK3128安卓5.1系统APK签名实战指南&#xff1a;工具获取与问题排查全解析 在嵌入式Android开发领域&#xff0c;RK3128芯片因其性价比优势被广泛应用于各类智能终端设备。当开发者需要为这类设备定制系统应用或预装APK时&#xff0c;掌握正确的签名方法至关重要。不同于普通And…...

手把手教你用PHPStudy部署彩虹云商城二开版(2025修复完整版,含自动对接与漏洞修复)

零基础实战&#xff1a;PHPStudy环境下的彩虹云商城完整部署指南&#xff08;2025安全强化版&#xff09; 在个人站长和电商创业者的圈子里&#xff0c;彩虹云商城系统一直以其轻量化和易用性备受青睐。最近接触到的这个2025修复版&#xff0c;不仅保留了原系统的核心优势&…...

3分钟轻松获取无水印抖音视频:DouYinBot全能解析工具使用指南

3分钟轻松获取无水印抖音视频&#xff1a;DouYinBot全能解析工具使用指南 【免费下载链接】DouYinBot 抖音无水印下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 在短视频创作的浪潮中&#xff0c;每个创作者都曾遇到这样的困扰&#xff1a;精心挑选的抖音…...