leetcode hot 1-2
1.两数之和
解法1:暴力遍历
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {for(int i=0;i<nums.size();i++){for(int j=i+1;j<nums.size();j++){if(nums[i]+nums[j]==target){return {i,j};}}}return{};}
};
遇到的问题:
在开始的时候,第二重循环将j设置成 j=i 结果第一个数相加两次等于target
输入:
[3,2,4] 6
输出:
[0,0]
预期结果:
[1,2]
此时将j 指向 i的下一个便能通过
暴力解法的时间复杂度是n^2
解法2:哈希表
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {map<int,int>m;for(int i=0;i<nums.size();i++){auto it=m.find(target-nums[i]);//如果查找成功,find返回下标,如果没找对,返回end()if(it!=m.end()){return {it->second,i};}m[nums[i]]=i;}return {};}
};
遇到的问题:
插入的时候使用insert结果报错了
哈希表的高效查找可以使时间复杂度降下到o(n)
2.两数相加
解法1:模拟
直接遍历链表对应数字相加即可。逐位计算它们的和,并与前面的进位值相加
比如,两个链表对应位的数字分别为n1和n2,进位为carry(通常为0和1),则它们的和为(n1 + n2 + carry),对应位上数字变为(n1 + n2 + carry)%10,新的进位为(n1 + n2 + carry)/10。
如果两个链表长度不一样,长度短的链表后续对应位上值均为0即可。如果遍历结束之后,carray大于0(也就是等于1),则在结构链表后面新增一个节点,
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* head=nullptr,*tail=nullptr;int carry=0;while(l1||l2){int n1=l1?l1->val:0;int n2=l2?l2->val:0;int sum=n1+n2+carry;if(!head){head=tail=new ListNode(sum%10);}else{tail->next=new ListNode(sum%10);tail=tail->next;}carry=sum/10;if(l1){l1=l1->next;}if(l2){l2=l2->next;}}if(carry>0) {tail->next=new ListNode(carry);}return head;}
};
遇到的问题:
int n1=l1?l1->val:0; int n2=l2?l2->val:0; 一开始没看懂这两句,其实它们等价于
int n1 = l1 != null ? l1.val : 0;int n2 = l2 != null ? l2.val : 0;
另外又将这两句放在了while之外,结果造成节点一直指向第一个,没有更新
之后又将 tail->next=new ListNode(carry); 写成 tail=new ListNode(carry); tail=tail->next;
最后造成当 最后相加carry存在的时候,没有进位
上述方法时间复杂度的计算与链表的长度有关,比如两个链表的长度分别为m和n,则遍历的次数为max(m,n),也就m和n中取最大值,所以时间复杂度为O(n)。
解法2:递归
不用递归没有灵魂。尽管多数时候,递归不见得更有效率
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {if(!l1) return l2;if(!l2) return l1;int target=l1->val+l2->val;ListNode* res=new ListNode(target%10);res->next=addTwoNumbers(l1->next,l2->next);if(target>=10) {res->next=addTwoNumbers(res->next,new ListNode(1)); }return res;}
};
递归解法非常巧妙。
做递归题目一定要牢记「递归函数的定义」。
递归函数定义:addTwoNumbers 表示将两个链表 l1 和 l2 相加得到的新链表;
递归终止条件:如果 l1 和 l2 有一个为空,则返回另外一个。
递归函数内容:
把两个链表节点的值相加(结果记为 add )。把 add 模 1010 作为当前的链表节点的值。
把两个链表的 next 节点相加。(注意:如果当前相加的结果 add >= 10add>=10,需要把 next 节点相加得到的结果 + 1。)
递归解法妙在天然地处理好了两个链表不一样长、最终相加结果有进位的情况。
可以推演一下递归调用的时间复杂度。针对递归调用的时间复杂度计算,本质上要看:递归的次数✖️每次递归中的操作次数。那么,上述方法递归了几次呢?递归的次数也是与两个链表最长的那个的长度有关,最后可能会因为进位多算一次,因此递归次数为n或n+1,而内部计算并不随n的变化而变化,执行次数为常数。因此整体时间复杂度为n*1 = O(n)。
空间复杂度依旧与结果链表的长度有关,因此依旧为O(n)。
leetcode hot 1-2相关推荐
- leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...
- LeetCode 10. Regular Expression Matching python特性、动态规划、递归
前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...
- leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
题目解析 代码如下 题目解析 这一题是一道会员的题目,题目介绍如下: Given a string, find the length of the longest substring T that c ...
- leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法
题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...
- leetcode:2680 Remove Duplicates from Sorted Array 删除数组中的重复元素
leetcode:26 对数组元素进行去重,使得原数组重复元素最多保留1个 限制: 我们不可以额外分配数组,必须保持空间复杂度为O(1) 这个并不难实现: class Solution(object) ...
- LeetCode简单题之二进制表示中质数个计算置位
题目 给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数. 计算置位位数 就是二进制表示中 1 的个数. 例如, 21 ...
- LeetCode简单题之删除字符使字符串变好
题目 一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 . 给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 . 请你返回删除后的字符串.题目数据保证答案总 ...
- LeetCode简单题之找出两数组的不同
题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中: answer[0] 是 nums1 中所有 不 存在于 nums2 中的 ...
- LeetCode中等题之区域和检索 - 数组可修改
题目 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nu ...
- LeetCode简单题之整理字符串
题目 给你一个由大小写英文字母组成的字符串 s . 一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件: 若 s ...
最新文章
- python将二维列表内容写入和读取.txt文件
- php 代码线程,php实现多线程代码
- arma模型_R语言与计量经济学(七)ARMA模型
- java设计一百亿的计算器_请设计一个一百亿的计算器
- VMware虚拟化上安装F5负载均衡系统(BIG-IP LTM)
- SQL Server数据表在编程中实现导出EXCEL的几种方法
- 设计模式之建造者(builder)模式
- 左连接 oracle条件查询,sql 左连接查询条件and与where
- amlogic logo amlogic rk tvbox 电视盒 定制化开发(一) 开机logo 定制
- 如何快速爬取QQ音乐上的歌手曲目排名并做成Excel表格形式
- visudo精确用户赋权与sudo日志跟踪
- 软件设计原则之 SOLID Principle
- 一个手机浏览器的发展史
- Thinking in Java 中闪耀的星星(一)
- ardupilot gazebo打开卡死解决办法
- oracle版本和驱动ojdbc、jdk版本对应关系
- 英伟达最新发布NVRadarNet:基于纯Radar的障碍物和可行驶区域检测
- IPD三级计划体系在汽车研发领域的实践
- 商品规格表的制作 mysql_购物商城数据库设计-商品表DDL(Mysql)
- SQL 增加列、修改列、删除列
热门文章
- aws s3 静态网站_使用AWS S3存储桶启动静态网站
- sql还原数据库备份数据库_有关数据库备份,还原和恢复SQL面试问题–第三部分
- C语言拾遗(二):符号重载
- Java使用Swing实现五子棋。
- Navicat 11破解版
- 【考古向翻译】Pwn2Own 2010 Windows 7 Internet Explorer 8 exploit
- android笔记--与服务器交互更改简历状态
- ##API(一)————枚举
- Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--K-密码