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相关推荐

  1. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间

    题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...

  2. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  3. leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法

    题目解析 代码如下 题目解析 这一题是一道会员的题目,题目介绍如下: Given a string, find the length of the longest substring T that c ...

  4. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法

    题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...

  5. leetcode:2680 Remove Duplicates from Sorted Array 删除数组中的重复元素

    leetcode:26 对数组元素进行去重,使得原数组重复元素最多保留1个 限制: 我们不可以额外分配数组,必须保持空间复杂度为O(1) 这个并不难实现: class Solution(object) ...

  6. LeetCode简单题之二进制表示中质数个计算置位

    题目 给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数. 计算置位位数 就是二进制表示中 1 的个数. 例如, 21 ...

  7. LeetCode简单题之删除字符使字符串变好

    题目 一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 . 给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 . 请你返回删除后的字符串.题目数据保证答案总 ...

  8. LeetCode简单题之找出两数组的不同

    题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中: answer[0] 是 nums1 中所有 不 存在于 nums2 中的 ...

  9. LeetCode中等题之区域和检索 - 数组可修改

    题目 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nu ...

  10. LeetCode简单题之整理字符串

    题目 给你一个由大小写英文字母组成的字符串 s . 一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件: 若 s ...

最新文章

  1. python将二维列表内容写入和读取.txt文件
  2. php 代码线程,php实现多线程代码
  3. arma模型_R语言与计量经济学(七)ARMA模型
  4. java设计一百亿的计算器_请设计一个一百亿的计算器
  5. VMware虚拟化上安装F5负载均衡系统(BIG-IP LTM)
  6. SQL Server数据表在编程中实现导出EXCEL的几种方法
  7. 设计模式之建造者(builder)模式
  8. 左连接 oracle条件查询,sql 左连接查询条件and与where
  9. amlogic logo amlogic rk tvbox 电视盒 定制化开发(一) 开机logo 定制
  10. 如何快速爬取QQ音乐上的歌手曲目排名并做成Excel表格形式
  11. visudo精确用户赋权与sudo日志跟踪
  12. 软件设计原则之 SOLID Principle
  13. 一个手机浏览器的发展史
  14. Thinking in Java 中闪耀的星星(一)
  15. ardupilot gazebo打开卡死解决办法
  16. oracle版本和驱动ojdbc、jdk版本对应关系
  17. 英伟达最新发布NVRadarNet:基于纯Radar的障碍物和可行驶区域检测
  18. IPD三级计划体系在汽车研发领域的实践
  19. 商品规格表的制作 mysql_购物商城数据库设计-商品表DDL(Mysql)
  20. SQL 增加列、修改列、删除列

热门文章

  1. aws s3 静态网站_使用AWS S3存储桶启动静态网站
  2. sql还原数据库备份数据库_有关数据库备份,还原和恢复SQL面试问题–第三部分
  3. C语言拾遗(二):符号重载
  4. Java使用Swing实现五子棋。
  5. Navicat 11破解版
  6. 【考古向翻译】Pwn2Own 2010 Windows 7 Internet Explorer 8 exploit
  7. android笔记--与服务器交互更改简历状态
  8. ##API(一)————枚举
  9. Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
  10. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--K-密码