P8大佬的算法解题笔记-【千锋教育】面试宝典

2024-07-03
| 50页
| 75人阅读
| 0人下载

内容正文:

1.合并两个有序链表 题目描述 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4,1->3->4 输出:1->1->2->3->4->4 前置知识 。递归 千锋学习站小程序 ·链表 思路 信搜索 本题可以使用递归来解,将两个链表头部较小的一个与剩下的元素合并,并返回排好序的链表 头,当两条链表中的一条为空时终止递归。 关键点 获取更 掌握链表数据结构 考虑边界情况 代码 内部资 JS Code: /** Definition for singly-linked list. function ListNode(val){ this.val val; this.next null; */ /米* @param fListNode}11 @param {ListNode}12 @return {ListNode} */ const mergeTwoLists function (11,12){ if(11==null){ return 12; if (12 ===null){ return 11; 3 if (11.val 12.val){ 11.next mergeTwoLists(11.next,12); return 11; else 12.next mergeTwoLists(l1,12.next); return 12; 3 复杂度分析 M、N是两条链表1、2的长度 ·时间复杂度:O(M+N) ·空间复杂度:O(M+N) 获取更多微信搜索:千锋学习站小程序 扩展 。 你可以使用迭代的方式求解么? 迭代的CPP代码如下: class Solution public: ListNode*mergeTwoLists(ListNode*a,ListNode*b){ ListNode head,*tail =&head; while (a &b){ if (a->val <=b->val){ tail->next a; a a->next; else tail->next b; 3 tail tail->next; tail->next=a?a:b; return head.next; 迭代的JS代码如下: var mergeTwoLists function (11,12){ const prehead new ListNode(-1); let prev prehead; whi1e(111=nu11&121=nu11){ if (11.val <=12.val){ prev.next 11; L1=11.ne×t; else prev.next 12; 12=12.next prev prev.next; prev.next 11 == return prehead.next; 欲取更之仪信搜索干锋学习站小程序 2.括号生成 目描达 数字代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。 示例: 输入:n=3 输出:[ "(O)", "(OO)", "(O)O", "OO0" 前置知识 ·DFS ·回溯法 思路 本题是20.有效括号的升级版。 站小程序 由于我们需要求解所有的可能,因此回溯就不难想到。回溯的思路和写法相对比较固定,并且 回溯的优化手段大多是剪枝。 不难想到,如果左括号的数目小于右括号,我们可以提前退出,这就是这道题的剪枝。比如 ()·,后面就不用看了,直接退出即可。回溯的退出条件也不难想到,那就是: ·左括号数目等于右括号数目 。左括号数目+右括号数目=2*n 信搜索 由于我们需要剪枝,因此必须从左开始遍历。 (WHY? 因此这道题我们可以使用深度优先搜索(回溯思想),从空字符串开始构造,做加法,即ds(左 括号数,右括号数目,路径),我们从dfs(0,0,")开始。 伪代码: res=▣ def dfs(l,r,s): if 1n or r n:return if (=r ==n):res.append(s) #剪枝,提高算法效率 if 1 <r:return #加一个左括号 dfs(1+1,r,s+'(') #加一个右括号 dfs(1,r+1,s+)') dfs(0,0,) return res 四」寸1y甲yH叉工,凶此%J儿而陬胡Sy地件。仁正曰小文为TT牙a百口yy陕,W 需要注意撤销S的选择了。类似: s.push_back(')'); dfs(1,r+1,s); s.pop_back(); 关键点 ·当I<r时记得剪枝 代码 JS Code: /米* 米 @param {number}n *@return{[stringl☐] *@param 1左括号已经用了几个 *@param r右括号已经用了几个 米@param str当前递归得到的拼接字符串结果 微信搜索:千锋学习站小程序 *@param res结果集 */ nc;1。,4e孕6 const generateParenthesis (n)f const res=☐g 1f(1=n&r并ny return res.push(str); /1小于P同不满足条件剪枝 if (lsry return; 3△◇ /人1小于n时可以插入左括号,最多可以插入n个 if (l<n)f dfs(1+1,r,stp+"("); //n<1时可以插入右括号 if(r<1)[ dfs(1,r+1,str+")") Mu八wyw) return res; 3 复杂度分析 ·时间复杂度:O(2^N) ·空间复杂度:O(2N) 3.合并K个排序链表 题目描述 示例: 输入: 1->4->5, 1->3->4, 2->6 输出:1->1->2->3->4->4->5->6 获取更多微信搜索: 前置知识 海 ·链表 思路 这道题目是合并k个已排序的链表,号称leetcode目前最难的链表题。和之前我们解决的 88.merge-sorted-array很像。 他们有两点区别: 1.这道题的数据结构是链表,那道是数组。这个其实不复杂,毕竟都是线性的数据结构。 4,心世达而女口开人1儿杀,P烂则八而女口T州!。心1正州送口y天姓在刀刚,世正心烂恐 难度为hard的原因。 因此我们可以看出,这道题目是88.merge--sorted-array的进阶版本。其实思路也有点像,我 们来具体分析下第二条。 如果你熟悉合并排序的话,你会发现它就是合并排序的一部分。 具体我们可以来看一个动画 千锋学习站小程序 数信搜索 白分斜中道 (动画来自htps://zhuanlan.zhihu.com/p/61796021) 关键点解析 获取更 ·分治 。归并排序(merge sort) 代码 部资 JavaScript Code: /米 @lc app=leetcode id=23 lang=javascript 米 [23]Merge k Sorted Lists https://leetcode.com/problems/merge-k-sorted-lists/description/ */ function mergeTwoLists(11,12){ const dummyHead = let current dummyHead; /11:1->3->5 /12:2->4->6 while (11 !=null &12 !=null){ if (11.val 12.val){ current.next=l1;//把小的添加到结果链表 current=current.next;//移动结果链表的指针 11=11.next;/移动小的那个链表的指针 else current.next =12; current current.next; 12 12.next; if (11 ===null)f current.next 12; else current.next 11; return dummyHead.next; /*来 获取更多微信搜索:千锋学习站小程序 Definition for singly-linked function ListNode(val){ this.val val; this.next null; 米3 */ /米米 米 @param {ListNode[]}lists @return [ListNode] */ var mergeKLists function (lists){ //图参考,https:/zhuanlan.zhihu.com/p/61796021 if (lists.length ==0)return null; if (lists.length ==1)return lists[]; if (lists.length =2){ return mergeTwoLists(lists[],lists[1]); const mid lists.length >1; const11=☐; for (let i=0;i<mid;i++){ const12=☐; for (let i mid,j=0;i<lists.length;i++,j++){ 12[j]=lists[i]; return mergeTwoLists(mergeKLists(11),mergeKLists(12)); } 复杂度分析 ·时间复杂度:O(km*logk) 。空间复杂度:O(logk) 相关题目 88.merge-sorted-array 千锋学习站小程序 皮道颗其实可以用性来做,感兴趣的同学发索:】 扩展 4.两两交换链表中的节点 题目描述 获取 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 1(2 2 3 示例1: 输入:head=[1,2,3,4] 输出:[2,1,4,3] 示例2: 输入:head=[☐ 输出:☐ 示例3: 输入:head=[1] 输出:[1] 提示: 0<=Node.val <=100 获取更多微信搜索:千锋学习站小程序 链表中节点的数目在范围[0,100]内 前置知识 ·链表 思路 部资料 设置一个dummy节点简化操作,dummy next指向head。 1.初始化first为第-个节点 2.初始化second为第二个节点 3.初始化current为dummy 4.first.next second.next 5.second.next first 6.current.next second

资源预览图

P8大佬的算法解题笔记-【千锋教育】面试宝典
1
P8大佬的算法解题笔记-【千锋教育】面试宝典
2
P8大佬的算法解题笔记-【千锋教育】面试宝典
3
P8大佬的算法解题笔记-【千锋教育】面试宝典
4
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。