leetcode1——两数之和

一、提出问题

给定一个整数数组 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
  • 只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

二、解决问题

1、利用暴力枚举解决

(1)思路

这应该是最简单的思路,即列出所有可能的组合,然后判断这些组合的和是否符合条件。

(2)代码

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){for(int i=0;i<=numsSize-2;i++)for(int j=i+1;j<=numsSize-1;j++){if(nums[i]+nums[j]==target){int* ret=malloc(sizeof(int)*2);ret[0]=i;ret[1]=j;*returnSize=2;return ret;}}*returnSize=0;return NULL;}

(3)复杂度

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

2、利用哈希表解决

(1)思路

注意到方法一的时间复杂度较高的原因,是对于数组中的一个数x,寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。

使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。

我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。

(2)代码

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;
}

(3)复杂度

  • 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1)地寻找 target - x。
  • 空间复杂度:O(N),其中 N是数组中的元素数量。主要为哈希表的开销。

总结回顾

这是leetcode的第一道题,首先我想到的就是双for循环解决,由于比较熟悉C,因此使用C语言来解答,解答过程中对参数的含义稍微懵了一下,不过看别人的答案,明白了参数的含义以及应该如何返回。后来想到作为算法题,应该可以更讲究技巧的,果然,高手们想到了哈希表。数据结构的知识已经还给老师了,对于别人的代码里的哈希操作只是大概了解,后续要恶补一下数据结构。另外对于时间复杂度、空间复杂度只有一个名词概念,复杂度是怎么算怎么定义的呢,也要认真学习一下。否则这些基本概念不熟悉就来刷题,只能贻笑大方了。第一次刷题,收获良多,坚持每天至少刷一题吧,不为别的,就为了活动活动脑袋,巩固一下语言知识。

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

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

相关文章

iOS性能优化技术

小小总结&#xff0c;后续继续跟进。 1. 提高应用性能的几个开发细节 * 尽量避免使用constraint实现动画 * 尽量避免使用数组的删除操作 * 尽量避免使用 NSString&#xff1a;&#xff1a;stringWithFormat * 尽量避免使用 NSImage&#xff1a;&#xff1a;imageWithContentOfF…

如何脱离SDK,使用DW5.5和phonegap以及JQMobile搭建开发环境

也许有些人是学C出身&#xff0c;对于Java几乎不了解。一时心血来潮想学学android开发&#xff0c;于是下载了Eclipse&#xff0c;安装了SDK&#xff0c;有模有样的学习起来。也许是懒惰了&#xff0c;对于java一直总是提不起精神。于是确定使用DreamweaverJquery mobilePhoneg…

leetcode2——两数相加

一、提出问题 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以…

7-5 单源最短路径

7-5 单源最短路径 请编写程序求给定正权有向图的单源最短路径长度。图中包含n个顶点&#xff0c;编号为0至n-1&#xff0c;以顶点0作为源点。 输入格式: 输入第一行为两个正整数n和e&#xff0c;分别表示图的顶点数和边数&#xff0c;其中n不超过20000&#xff0c;e不超过10…

32为Linux安卓AVD启动报错

2019独角兽企业重金招聘Python工程师标准>>> 当使用android的AVD时提示以下错误&#xff1a;Starting emulator for AVD NexusOne ERROR: 32-bit Linux Android emulator binaries are DEPRECATED, to use them you will have to do at least one of the following:…

hdu 2007 - 平方和与立方和

题目大意&#xff1a; 给定一段连续的整数&#xff0c;求出他们中所有偶数的平方和以及所有奇数的立方和。 解答&#xff1a; 坑你没商量&#xff01;要考虑输入数a,b的大小。如果a>b,需要交换a&#xff0c;b的值。转载于:https://www.cnblogs.com/ZJUT-jiangnan/p/3613488.…

(原创)优酷androidclient 下载中 bug 解决

在网络情况不好的情况下&#xff0c;优酷androidclient下载视频会终止&#xff0c;用户放弃下载点击 删除该任务以后&#xff0c;切换到网络好的情况下进行下载&#xff0c;会显示该视频已在下载队列里&#xff0c;然后clientUI界面却什么都看不到。导致用户根本无法下载。 事实…

填问卷,得《2015中国呼叫中心知识库现状与问题报告》

为了解中国呼叫中心知识库运营现状和存在的主要问题&#xff0c;掌握呼叫中心知识库的总体发展水平&#xff0c;中国知识管理中心&#xff08;KMCenter&#xff09;面向全国呼叫中心发起“2015中国呼叫中心知识库现状与问题调研”活动&#xff0c;主要通过问卷调研和典型用户访…

C语言经典算法100例-031-判断星期几

题目如下&#xff1a; 请输入星期几的第一个字母来判断一下是星期几&#xff0c;如果第一个字母一样&#xff0c;则继续判断第二个字母。 比较简单&#xff0c;直接看程序吧。 #include <stdio.h> #include <stdlib.h> #include <conio.h> int main() {char …

ARM汇编的特点

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、LDR/STR架构 ARM采用RISC架构&#xff0c;CPU本身不能直接读取内存&#xff0c;需要先将内存中的内容加载到CPU的通用寄存器中才能被CPU处理。换言之&#xff0c;寄存器是CPU和内存进行数据交换的中介。…

持久代是方法区还是堆中的?

2019独角兽企业重金招聘Python工程师标准>>> 昨天跟一哥们讨论&#xff0c;持久代在方法区&#xff0c;属不属于堆中的? 它的意思是持久代不属于堆,属于方法区&#xff0c;而我则认为持久代属于方法区也属于堆。 结果今天上网一查,还真的是。下面是解释: 持久代”仅…

妈的我好像发现是哪出问题了

我不能被这个破玩意卡这么久。 今晚的第一个收获是&#xff0c;我在下载方法里面&#xff0c;获取了API写完了文件而且关闭了之后又加上了一段代码用来测试。 内容是打开刚刚写好的文件&#xff0c;把里面的内容打印到日志上&#xff0c;结果我发现不但文件存在&#xff0c;而且…

Web 前端攻防(2014版)-baidu ux前端研发部

http://fex.baidu.com/articles/page2/ Web 前端攻防&#xff08;2014版&#xff09; zjcqoo | 20 Jun 2014禁止一切外链资源 外链会产生站外请求&#xff0c;因此可以被利用实施 CSRF 攻击。 目前国内有大量路由器存在 CSRF 漏洞&#xff0c;其中相当部分用户使用默认的管理账…

plsqlnbsp;分页

select * from (select rownum rn,ps.* from (select * from user_t) ps ) where rn>1 and rn<10 //从第一页开始&#xff0c;第十行结束版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 转载于:https://www.cnblogs.com/jamesf/p/4751701.ht…

Silverlight动态设置WCF服务Endpoint

2013-02-02 05:57 by jv9, 1763 阅读, 3 评论, 收藏, 编辑 去年12月收到一位朋友的邮件&#xff0c;咨询Silverlight使用WCF服务&#xff0c;应用部署后一直无法访问的问题&#xff0c;通过几次交流&#xff0c;才发现在他的项目中&#xff0c;全部使用静态URL作为WCF服务的End…

SqlServer 的IDENTITY_INSERT设置为OFF问题

其实是表的主键设为GenerationType.AUTO 为自动写入 只要手动填写其他字段的值就可以&#xff0c;不需要写主键值&#xff08;否则不能添加数据&#xff09; 也可以尝试set IDENTITY_INSERT 表名 on 转载于:https://www.cnblogs.com/fengyu9/p/3620942.html

第6季2:基于RTSP协议的实时视频流传输的源码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 博文第一季2&#xff1a;HI3518EV200的初体验中&#xff0c;所提供的测试文件sample_venc实现了基于RTSP协议的实时视频流传输功能。当时直接提供了二进制文件&#xff0c;现在我们来分析其对…

安卓获取星期几

Date t new Date();int day t.getDay();switch (day) {case 0:break;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;}转载于:https://blog.51cto.com/luoguoxin/1613493

MemCached的telnet命令行参数

1、启动Memcache 常用参数 -p <num> 设置TCP端口号(默认不设置为: 11211) -U <num> UDP监听端口(默认: 11211, 0 时关闭) -l <ip_addr> 绑定地址(默认:所有都允许,无论内外网或者本机更换IP&#xff0c;有安全隐患&#xff0c;若设置为127.0.0.1…

Kernel Memory Layout on ARM Linux

这是内核自带的文档&#xff0c;讲解ARM芯片的内存是如何布局的&#xff01;比较简单&#xff0c;对于初学者可以看一下&#xff01;但要想深入理解Linux内存管理&#xff0c;建议还是找几本好书看看&#xff0c;如深入理解Linux虚拟内存&#xff0c;嵌入系统分析&#xff0c;L…