算法题-----题目、题解、个人算法、个人思考,项目说明】这里记录算法题目,这里记录:算法题目简单描述,暂存对于这道题的SK_cache(自己的卡点、自己的思路、自己对这道题的理解,自己的疑问、自己对这道题的程度),答案的思路、这道题考点、这题下一步规划。以便之后能回顾。
【tag】:“dai代码实现”。“完全没思路”。解题策略:“动态规划”。“贪心算法”。“回溯算法”。“dfs”。“bfs”。“代码实现已通过”。
【动态规划】
【刷题顺序】数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构------------by卡尔
【Imporatance】卡尔《代码随想录》。
数组—相关算法题,类型】 资料)二分法、双指针、滑动窗口、模拟行为。
LC.27.移除元素
LC.27.移除元素题目自述:input:nums = [3,2,2,3], val = 3。仅使用 O(1) 额外空间并 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。output:2。
LC.27.移除元素–题解
对于题解的思考:利用到了题目的条件"长度后的数字不用管"。很巧妙。
2022.2.20----已懂dai代码实现;2022.2.21—没做出。
2022.11.7我的算法(我的算法大致思路属于最直观能想到的方法,还未用代码实现,不知道能否用代码实现。)
int result==0;
//从后往前遍历
for nums.length-1 to 0
if nums[i] == val
//计算val个数
result++;
//将这个数字后沉
if(nums[i+1]!=val)
swap(nums[i],nums[i+1])
else
continue
return nums.length-result
LC.977. 有序数组的平方
LC.977. 有序数组的平方
自述题目:一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]。
2022.20.20----已懂dai代码实现;2022.2.21–用时20min做出。
2022.11.7我的算法:(还没有用代码实现)
申请一个同样大小的数组nums2
int left=0;
int right=nums2.length
遍历nums
if num<0
nums2[right--]=num*num
else
nums2[left++]=num*num
return nums2
LC.209.长度最小的子数组
自述题目:一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。输入:target = 7,nums = [2,3,1,2,4,3]。输出:2
2022.2.20----已懂dai代码实现;2022.2.21—20min没做出;
2022.11.7我的算法:
暴力法:两层遍历
LC.54.螺旋矩阵
自述题目:一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]],
输出:[1,2,3,6,9,8,7,4,5]。
2022.2.20—会dai代码实现;2022.2.21—20min没做出;
2022.11.7我的算法:
LC.59.螺旋矩阵 II
自述题目:给你一个正整数 n ,生成一个包含 1 到 n的平方 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
2022.2.20----已懂dai代码实现;
2022.2.21—30min没做出—30min做出。
2022.2.21-----这道题的核心在于边界的控制,自己的找规律不够好,半天没有找到变化的规律,以至于没有设置好可变化的边界。
2022.11.7我的算法:
JZ6.从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表
自述题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
2022.2.22----15min做出,方法:递归。
LC.24.两两交换链表中的节点
【标记】借助链表上多个指针实现节点之间的交换。
LC.24. 两两交换链表中的节点
自述题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
2022.2.21–不会。2022.2.22-----20min–知道要用多个指针,但被搞晕了。
迭代法不懂理解。
LC.707.设计链表
题目描述:设计一个链表类,并实现常用方法。
LC.707.设计链表
【Imporatance】卡尔《代码随想录》。
2022.2.21----不会。
2022.2.22----不会,创建了两个class,自己没搞清楚这两个class的关系,即没搞懂类的组合。
mine-----2022.2.21----自己用代码生成一个链表,并且两个class不太懂,代码实现上的问题,java引用的理解不熟。
2022.5.31:不会。不懂为啥可以用两个class。还有一个收获点:官方题解中,是在内部又创建了一个方法供别的方法调用。----看懂题解了,dai自己代码实现。
LC146. LRU 缓存
题目描述:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
2022.2.18----不会。
cache:方法:哈希表+双链表
“《左程云》打印两个有序链表的公共部分”
NC.53.删除链表的倒数第n个节点、“《左程云》在单链表和双链表中删除倒数第K个节点”、
2022.5.29—20min–看题解,懂了。
Cache】第一眼容易想到O(n2)的方法,但是通过分类讨论,就可以把时间复杂度降下来了。
“《左程云》删除链表的中间节点和a/b 处的节点”。(即删除链表的中间节点,删除链表的a/b 处的节点。)
LC.203.移除链表元素
题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
【Imporatance】卡尔《代码随想录》。
”《左程云》删除无序单链表中值重复出现的节点“。题目描述:给定一个无序单链表的头节点head,删除其中值重复出现的节点。例如:1->2->3->3->4->4->2->1->1->null,删除值重复的节点之后为1->2->3->4->null。
JZ.76.删除链表中重复的结点
JZ.18.删除链表的节点
LC.19.删除链表的倒数第 N 个结点
【Imporatance】卡尔《代码随想录》。
2022.2.21–看了题解:只用遍历一次的方法----懂了。
“《左程云》在单链表中删除指定值的节点”。题目描述:给定一个链表的头节点head和一个整数 num,请实现函数将值为num的节点全部删除。例如,链表为1->2->3->4->null,num=3,链表调整后为:1->2->4->null。
“《左程云》一种怪异的节点删除方式”。题目描述:链表节点值类型为int型,给定一个链表中的节点node,但不给定整个链表的头节点。如何在链表中删除 node?请实现这个函数,并分析这样做会出现哪些问题。
NC.25.删除有序链表中重复的元素-I
题目描述:删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
2022.3.10
NC.24.删除有序链表中重复的元素-II
题目描述:给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
2022.3.10
JZ22.链表中倒数最后k个结点
2022.2.22----15min做出;采用方法:遍历计算链表长度,长度减去题目中给地倒数数,再遍历一次;YW:我感觉这种方式时间复杂度也是O(n),但好像这种方法不好。
LC.142.环形链表 II && JZ23.链表中环的入口结点
【Imporatance】卡尔《代码随想录》。
最简单的方法是借助Java的Set集合的特性,但浪费空间。
2022.2.21—想到了用快慢指针方法,但没有考虑到题解中的数学相关的等式,以至于我的方法只能保证两指针相遇,但没法保证实在环节点处相遇。答案题解还没看。
“《左程云》两个单链表相交的一系列问题”。题目描述:在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1和 head2,这两个链表可能相交,也可能不相交。请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null 即可。
LC.面试题 02.07. 链表相交
【Imporatance】卡尔《代码随想录》。
2022.2.21—我的思路:直接把节点存入集合Set,可利用Set的性质帮我们发现是否已经有节点存入,则找到相同节点。此方法占用空间大。-----题解:两链表尾部对齐,懂了。 2022.2.22----代码写出来了,但超出时间限制,还没发现问题在哪。
NC.66.两个链表的第一个公共结点
“《左程云》反转单向和双向链表”(即,反转单向链表。反转双向链表。)
LC.206.反转链表、NC.78.反转链表
【Imporatance】卡尔《代码随想录》。
2022.2.21—通过----mine方法:重新创建了一个链表。
题解方法:方法1:不用开辟新空间,而是改变next指针指向。方法2:递归法dai。
2022.3.17:Hou:“想到用递归,没想出算法思路”
2022.3.18:看了题解,另一种方法:不用递归,看懂了。
”《左程云》反转部分单向链表“
”《左程云》环形单链表的约瑟夫问题“(即,一个环形单链表,转圈报数,每次数到数m则退出,返回最后的一个节点)
“《左程云》判断一个链表是否为回文结构”(即,若1->2->1,则为true)
“《左程云》将单向链表按某值划分成左边小、中间相等、右边大的形式”
“《左程云》复制含有随机指针节点的链表”。(daiBS)mine–这题想考察的是什么,这题核心是什么。
剑指 Offer 35. 复杂链表的复制
2022.5.25:Hou–遍历链表,同时新建一个链表并赋值?------dai看题解。
“《左程云》两个单链表生成相加链表”。题目描述:假设链表中每一个节点的值都在0~9之间,那么链表整体就可以代表一个整数。例如:9->3->7,可以代表整数937。给定两个这种链表的头节点head1和 head2,请生成代表两个整数相加值的结果链表。例如:链表1为9->3->7,链表2为6->3,最后生成新的结果链表为1->0->0->0。
“《左程云》将单链表的每K个节点之间逆序”。题目描述:给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。例如:链表:1->2->3->4->5->6->7->8->null,K=3。
调整后为:3->2->1->6->5->4->7->8->null。其中7、8不调整,因为不够一组。
”《左程云》将搜索二叉树转换成双向链表“。
“《左程云》单链表的选择排序”
2022.5.25----Hou:有思路,和书上好像不一样,dai实现,看是否正确。
LC.148. 排序链表 剑指 Offer II 077. 链表排序
2022.5.26-----Hou使用插入排序,但是超时了。
2022.5.29-----40min—没看懂题解。
Cache】方法1:自底向上的归并排序。方法2:自顶向下的归并排序。
LC.147.对链表进行插入排序
2022.5.26—通过。
“《左程云》向有序的环形单链表中插入新节点”。
“《左程云》合并两个有序的单链表”。
LC.23.合并K个升序链表
“《左程云》按照左右半区的方式重新组合单链表”。
143.重排链表 剑指 Offer II 026. 重排链表
JZ.48.最长不含重复字符的子字符串
LC.1047.删除字符串中的所有相邻重复项
【Imporatance】卡尔《代码随想录》
2022.2.22-----30min做出来了。
小技巧:栈中存字符串,通过字符串拼接,使得出栈后拼成和原字符串顺序相同的字符串。
LC.22.括号生成
2022.6.3----没思路。
cache】暴力法生成所有可能的括号。如何生成?—递归。如何写递归?—。已经有了所有的括号类型,如何进行判断这个括号是否符合规则-----维持一个变量,左括号数-右括号数。
LC.20.有效的括号
【Imporatance】卡尔《代码随想录》。
2022.2.22-----20min做出,我的方法:栈。
【myTag】字符串,相邻字符串之间有计算任务,可借助栈。
美团2020校招后台开发方向笔试题:计算布尔字符串的运算结果
美团编程题:模式串和目标串是否匹配
2022.3.6—读题,辨识题目,感觉不会。
美团编程题:根据字母序列,推算字母排列顺序规则
题目描述:已知一种新的火星文的单词由英文字母(仅小写字母)组成,但是此火星文中的字母先后顺序未知。给出一组非空的火星文单词,且此组单词已经按火星文字典序进行好了排序(从小到大),请推断出此火星文中的字母先后顺序。
题解的思路:“有向无环图,拓扑排序树”----自己还不会图类算法题。
2022.3.6—不会。
二叉树相关基础且核心算法题,陈列】非递归形式先序,中序,后序遍历二叉树。层次遍历二叉树。
左:遍历二叉树的神级方法
左:判断t1树中是否有与t2树拓扑结构完全相同的子树
左:在二叉树中找到一个节点的后继节点
左:调整搜索二叉树中两个错误的节点
左:判断t1树是否包含t2树全部的拓扑结构
左:在二叉树中找到两个节点的最近公共祖先
左:Tarjan 算法与并查集解决二叉树节点间最近公共祖先的批量查询问题
左:二叉树节点间的最大距离问题
左:二叉树的按层打印与ZigZag打印
LC.101.对称二叉树
题目描述:给你一个二叉树的根节点 root , 检查它是否轴对称。
2022.2.28----没思路—>看题解,知道是用递归,自己想,超时没想出来—反思:没想到用递归、知道递归也不会用。
LC.111.二叉树的最小深度
题目描述:给定一个二叉树,找出其最小深度。
2022.2.28—解法有误----mySF:如果根节点左右子树都不为空,那就计算左右子树的最短路径,然后选其中最小的返回。如果根节点有一个子树为空,那就对非空的计算最短路径,再直接返回。
LC.222.完全二叉树的节点个数。左:统计完全二叉树的节点数
题目描述:给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
2022.2.28----没思路—看题解,”二分查找 + 位运算“不懂,先过。
左:统计和生成所有不同的二叉树
LC.404.左叶子之和
题目描述:给定二叉树的根节点 root ,返回所有左叶子之和。
2022.3.4—有点思路,但形不成算法,超时。----看题解,知道思路,自己实现,做出来了。
LC.513.找树左下角的值
题目描述:给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。
2022.3.4—没思路。
LC.654.最大二叉树
题目描述:给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nums 构建的 最大二叉树 。
【myTag】:mine:“这题很经典,属于二叉树的反序列化”,
2022.3.4—没思路。
LC.110.平衡二叉树。 左:判断二叉树是否为平衡二叉树
2022.2.28----HouSF:左右子树是平衡二叉树并且左右子树的高度之差小于1,“感觉像是得递归里面套递归,不会做了”----看了题解,确实是可以递归里面套一个递归的。—dai实现。
Nc.62.判断是不是平衡二叉树
题目描述:给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
左:在二叉树中找到累加和为指定值的最长路径长度
题目描述:给定一棵二叉树的头节点head和一个32位整数 sum,二叉树节点值类型为整型,求累加和为sum的最长路径长度。路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链。
LC.257.二叉树的所有路径
题目描述:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
2022.2.28—没思路----看题解,懂了,dai实现。
LC.112.路径总和
题目描述:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
2022.3.4—没思路。
LC.297.二叉树的序列化与反序列化、左:二叉树的序列化和反序列化
2022.4.12:没思路。看题解,懂了,dai代码实现。
LC.105.从前序与中序遍历序列构造二叉树、JZ7.重建二叉树
2022:1.22–不会。
2022.4.11:Hou:没思路。—>看题解,思路懂了。–>尝试自己用代码实现,不会实现。----->看题解代码,懂了,没想出来是因为Hou还是没有搞懂递归的思路。
LC.106.从中序与后序遍历序列构造二叉树
2022.3.4—没思路。
左:通过先序和中序数组生成后序数组
左:根据后序数组重建搜索二叉树
左:通过有序数组生成平衡搜索二叉树
LC.538.把二叉搜索树转换为累加树
2022.4.12:Hou:有点思路,但是代码实现中发现算法有误。看题解,懂了,dai代码实现。
2022.4.17:Hou:想出了算法"利用二叉搜索树的性质,先遍历右侧子树,再遍历此节点,最后遍历左侧子树。全局保留当下和。"------代码实现已通过。
左:找到二叉树中的最大搜索二叉子树
题目描述:给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这棵子树的头节点。
左:找到二叉树中符合搜索二叉树条件的最大拓扑结构
题目描述:给定一棵二叉树的头节点head,已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小。
LC.700.二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
题目描述:你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
2022.3.1----用递归方法做出来了,尝试用迭代,结果不会,看题解思路,自己实现了代码。
LC.98.验证二叉搜索树、左"判断一棵树是否为搜索二叉树"
题目描述:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
2022.3.1—HouSF:非空前提,比较一个节点的左节点是不是小于这个节点,右节点是不是大于,若是,则递归调用,终止条件为:当遍历到叶子节点的时候-------有误代码,因为没有考虑到当前节点的父节点。||||||代码正确,HouSF:应该考虑节点的父节点,借助两个变量。题解中的递归方法和自己的思路一样,但是自己的代码很繁杂,因为自己的代码,是"同时管了下面的两个子节点,又管了上面的节点"。
LC.530.二叉搜索树的最小绝对差
2022.3.5----有误,HouSL:“先序遍历,递归遍历每一个节点,求这个节点和其左右子节点更小的差值为多少,并将最小插值一直带着”。不知道是思路错了,还是代码实现有问题。这个思路,错在于,没有用中序遍历,导致丢失一种可能的情况:非同层的节点,但是其差值最小------看了题解的方法,懂了dai实现。
2022.4.12:Hou:自己相想出了算法:将中序遍历的结果放入一个数组中,然后对数组求相邻两元素最小之差。代码实现了,通过了。
2022.4.13:没有想出"不用申请数组"的解法。
LC.501.二叉搜索树中的众数
2022.3.6:没思路------看了题解标题,使用中序遍历-----自己试着在中序遍历基础上继续思考,想到了和题解一样的思路,但是无法代码实现----看题解,懂了。
2022.4.13:Hou:想到了用哈希表,但这个算法属于应该都能想到的较为基础的算法,这个算法的时间复杂度也高。看了题解的思路,懂了,dai代码实现。
2022.4.14:Hou:思路:中序遍历BST,遍历过程中将出现次数最大的节点值放入数组中。用代码实现了,通过了。
LC.235.二叉搜索树的最近公共祖先
题目描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
2022.3.7:没思路-------看了题解,懂了,自己实现了。
2022.4.14:没思路。
LC.236.二叉树的最近公共祖先
2022.4.14:Hou–有思路,思路正确,但是不会写代码。看了答案懂了,dai代码实现。
LC.701.二叉搜索树中的插入操作
题目描述;给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
2022.3.7:做出来了。
LC.450.删除二叉搜索树中的节点
题目描述:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
2022.3.7:没思路。
LC.96.不同的二叉搜索树
2022.4.11–Hou:没思路。看题解思路,懂了,dai代码实现。
2022.4.17:Hou:没思路。
LC.230.二叉搜索树中第K小的元素
2022.4.16:Hou:想到了最容易想到的算法:“中序遍历,将元素放入数组,然后返回k-1位置上的元素。”----这个算法不够好,有dai思考优化的方法。
JZ31 栈的压入、弹出序列题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
2022.1.24不会。
2022.3.24:不会。—看了题解思路,懂了,不会代码实现,看了题解代码,懂了。dai代码实现。
LC.232.用栈实现队列 、 JZ9.用两个栈实现队列、《左程云》由两个栈组成的队列
【Imporatance】卡尔《代码随想录》。
2022.2.22-----15min做出。
JZ30.包含min函数的栈
LC.155.最小栈
LC.225.用队列实现栈
【Imporatance】卡尔《代码随想录》。
2022.2.22----没思路。
LC.704.二分查找-----2022.2.20–辨识dai做
JZ4 二维数组中的查找、LC.240.搜索二维矩阵 II
题目描述:在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
做题日期记录:
SK_cache】minedai:横纵使用二分查找。
2022.1.24—未做出。2.27—没思路。-----懂了算法,dai代码实现。
2022.2.28----知道应该采用二分法,结果没实现出来,原来是之前题解没真正理解,这次懂了,dai代码实现。
LC.287.寻找重复数
题目描述:给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
2022.2.27—没思路不会------15min看题解没懂,先过。
2022.2.28—没思路,不会-----看题解:思路听巧妙的,但不理解它怎么想到的。
LC.300.最长递增子序列
题目描述:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
2022.2.27----mySF:双指针+回溯-----dai代码实现,回溯没写过,只是感觉这里可以用。----题解中说方法是:“动态规划;贪心+二分查找”,先放过。
2022.3.19:没思路----看题解,看懂了,dai代码实现。
JZ11 旋转数组的最小数字题目描述:有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
做题记录:2022.1.24----答案懂了。2.27—没思路不会—理解题解超时,先放过。
SK_cache】不要用暴力法。
LC.34.在排序数组中查找元素的第一个和最后一个位置
2022.2.27—mySF:用双指针,当没有遇到的时候一起走,当遇到了之后,一个不动,另一个向前继续走,直到不再等于所求值为止。------20min做出----"双指针"有点刻意了,其实下标就可以达到同样效果。----但这个算法不好,是最容易想到的,没有利用排序这个条件,有dai改进。
2022.3.19:Hou:用二分查找,找到目标值之后向两边扩散找到边界。思路是没错的,但是代码实现有点问题。
图—相关算法题,说明:Leetcode100,图类型题只有两道。
LC.207.课程表
2022.3.8:拓扑排序型题,拓扑排序还没学基础知识,先去学基础知识。
求1到n的最短路径(2022秋季招聘宁德时代笔试题)
单源最短路
JZ65 不用加减乘除做加法题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
做题记录:2022.1.25—。
JZ15 二进制中1的个数 LC.338.比特位计数
题目描述:输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。public int NumberOf1(int n) {}
2022.1.25—不会。
2022.4.5:Hou:没思路。看了题解给出的一个方法:计算一个数字二进制形式下的1的个数:假定数字n,对n进行n&(n-1),直到n为0,运算次数即为二进制含1个数。懂了,用代码实现了。在题解中看到这题还有动态规划的解法,Hou之前根本没想到,daiSK这题如何为何想到可以用动态规划?自己怎么没想到?如何用动态规划求解。
美团编程题:订单分配
题目描述:(美团2020校招后台开发方向笔试题)打车派单场景, 假定有N个订单, 待分配给N个司机。每个订单在匹配司机前,会对候选司机进行打分,打分的结果保存在N*N的矩阵A, 其中Aij 代表订单i司机j匹配的分值。假定每个订单只能派给一位司机,司机只能分配到一个订单。求最终的派单结果,使得匹配的订单和司机的分值累加起来最大,并且所有订单得到分配。
2022.3.6----不会。
【Hou Abstract description】:每个人做不同的事的能力不同,如何安排,让整体能力最大化。
美团编程题:包裹划分
题目描述:2110年美团外卖火星第3000号配送站点有26名骑手,分别以大写字母A-Z命名,因此可以称呼这些骑手为黄家骑士特工A,黄家骑士特工B…黄家骑士特工Z,某美团黑珍珠餐厅的外卖流水线上会顺序产出一组包裹,美团配送调度引擎已经将包裹分配到骑手,并在包裹上粘贴好骑手名称,如RETTEBTAE代表一组流水线包裹共9个,同时分配给了名字为A B E R T的5名骑手。请在不打乱流水线产出顺序的情况下,把这组包裹划分为尽可能多的片段,同一个骑手只会出现在其中的一个片段,返回一个表示每个包裹片段的长度的列表。输入:MPMPCPMCMDEFEGDEHINHKLIN。输出:9 7 8。划分结果:划分结果为MPMPCPMCM,DEFEGDE,HINHKLIN。每个骑手最多出现在一个片段中。像MPMPCPMCMDEFEGDE,HINHKLIN的划分是错误的,因为划分的片段数较少。
【Hou Abstract description】:
【HouSL】“从哪里划分得要知道后面还有没有这个区域的了,不知道这种题用什么方法。”
题解)”运用滑动窗口思路“
LC.121.买卖股票的最佳时机
题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
2022.3.20:Hou:只想到了暴力法。时间复杂度平方级别。------------看题解方法,懂了,自己代码实现了。
LC.122.买卖股票的最佳时机 II
题目描述:给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。返回 你能获得的 最大 利润 。
2022.3.20:Hou:没思路。--------看题解,懂了,dai代码实现。
注:LC.714.买卖股票的最佳时机含手续费、LC.309.最佳买卖股票时机含冷冻期 这两道题,就是在122的基础上稍微改了一点,大体思路都是在122这道题的基础上来的。2022.3.20:自己想出了算法,自己用代码实现了。
LC.198.打家劫舍
2022.3.20:Hou:自己想出了动态规划的方法,自己用代码实现了。
LC.213.打家劫舍 II
2022.3.20:Hou:使用了"LC.198.打家劫舍"的思路,只是在其基础上最后判断了一下最大值的情况是第一次偷了还是没偷,如果偷了,那就转为最后一次没偷的最大值。------此思路有问题,通过测试用例:49 / 75,比如测试用例[1,2,3]就会计算错误。有待改正。
JZ73.翻转单词序列
LC49字母异位词分组题目:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
记录:2022.2.9—没思路不会。
SK_cache】集合的特性的运用,懂了。
NC.61.两数之和
LC.15.三数之和题目描述:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
2022.2.9–不会,看答案懂了,dai实现。
2022.3.12–不会,没思路。
2022.3.13:没思路。–看题解,方法:双指针,懂了,自己实现,没通过,因为[0,0,0,0]这个特殊情况下不成立,dai修正自己的代码。
SK_cache】双指针法。
JZ5 替换空格题目描述:请实现一个函数,将一个字符串s中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
做题记录:2022.2.6
SK_cache】mine思路—2022.2.6(有思路dai实现)根据空格用split()分开,然后再每放一个字符串,后面加一个%20
JZ53 数字在升序数组中出现的次数题目描述:给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
public int GetNumberOfK(int [] array , int k) { }
做题日期记录】
SK_cache】这题非经典,答案说要用二分查找。
LC.150.逆波兰表达式求值
【Imporatance】卡尔《代码随想录》。
LC.347 前 K 个高频元素
【Imporatance】卡尔《代码随想录》。
JZ44 数字序列中某一位的数字题目描述:数字以 0123456789101112131415… 的格式作为一个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类推。
做题记录:2022.1.25----思路懂了未实现
2.27–mySF:通过递推,找到规律-----dai用代码实现。
JZ69 跳台阶题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。public int jumpFloor(int target) {}。
做题记录:2022.1.25—不会。
JZ51 数组中的逆序对题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007
做题记录:2022.1.23—有思路待实现—mine思路:利用双指针法。
JZ40 最小的K个数题目描述:给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。public ArrayList GetLeastNumbers_Solution(int [] input, int k) {}
做题记录:2022.1.25—有思路待实现–mine思路:给数组排序后取前k位即可。
JZ41 数据流中的中位数题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
做题记录:2022.1.25—有思路待实现–mine思路:创建ArrayList存储即可,思路 应该没问题,可能还有更优算法。
JZ66 构建乘积数组】
2022.1.29—不会,还没理解—这题发散思维
JZ50 第一个只出现一次的字符
JZ21 调整数组顺序使奇数位于偶数前面(一)
题目描述:输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
记录—2022.1.29–mine思路dai实现:申请两个新数组,一个放奇数一个放偶数,再合并(这是能直观想到的笨办法)。2022.2.6—自己的思路dai实现。看答案思路,没有申请额外空间,而是用双指针法。
JZ39 数组中出现次数超过一半的数字题目描述:给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
做题记录:mine思路——
【myTag】从一群中,选出一些符合规则的子集or按某种规则划分。
LC.131.分割回文串
题目描述:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。
2022.3.9
LC.93.复原 IP 地址
题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
2022.3.9
LC.78.子集
题目描述:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
2022.3.9
LC.90.子集 II
题目描述:给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
2022.3.9
LC.491.递增子序列
题目描述:给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
2022.3.9
【myTag】给你一堆东西,给你一个目标,你需要从这一堆东西中找出其中的一些符合目标的东西。
LC.77.组合
题目描述:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。
2022.3.13:没思路。—看题解,懂了。
2022.3.15:Hou:“需要一个循环+递归的结构”。1h–用代码实现了自己的思路,通过了。
https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ
LC.39.组合总和
题目描述:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
2022.3.15:Hou:“这道题的解法思路和LC.77很相似,但区别在于这道题同一个数字可以被无限制重复选取,所以要在调用递归式传递参数时有区别。”。自己想出了算法,自己用代码实现算法,通过了。
LC.40.组合总和 II
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。
2022.3.14—有点思路,进行不下去了。
2022.3.15–Hou:算法思路应该没问题,但是最后有一点待完成的部分,还没有想好怎么做。
LC.216.组合总和 III
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9。每个数字 最多使用一次。
2022.3.13:有点思路,但思路有点问题。
2022.3.15:自己相出了算法,自己用代码实现了,通过了。
LC.377.组合总和Ⅳ
2022.3.16:Hou:“自己想出了算法:回溯法,自己用代码实现,但是leecode平台提交显示超时了,自己在本地测试结果是对的,应该是平台测试的数据样本大,所以就超时了,我的这个方法应该是非常初级的回溯法,没有什么减枝优化,dai改进。”
LC.494.目标和
2022.3.28:Hou:想到了用回溯法,用代码实现了,自己测试了几个例子,是正常的,但是leecode平台提交显示超时了,说明自己回溯法的实现时间复杂度高。力扣官方题解的回溯法的思路和我的一样,时间复杂度也是指数级别,但是实现上有点不同,但是它的可以通过,不知道为什么。
【myTag】排列组合
LC.17.电话号码的字母组合
2022.3.9:Hou:“排列组合型题”。没思路。--------看题解,一种题解方法用dfs,看懂题解了,这个题解方法质量很高,值得多想想https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/ren-zhe-suan-fa-ren-zhun-ren-zhe-suan-fa-4krw/。dai代码实现。
LC.46.全排列、NC.BM55 没有重复项数字的全排列
题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
2022.3.17:Hou:“遍历数组以选定第一个数字,然后对数组中剩下的数字进行全排列,这是一种递归思想。代码未完成”.-------看了题解的方法,懂了,题解方法也是回溯,但是回溯的实现上不同,不知道是自己这个思路有问题,还是自己代码的实现方式有问题。
LC.47.全排列 II、NC.BM56 有重复项数字的全排列
题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序返回所有不重复的全排列。
2022.3.9
JZ38 字符串的排列题目描述:输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。public ArrayList< String> Permutation(String str) {}
2022.1.25—懂了(遍历加递归)。回溯法?
2022.2.27—不会。-----dai代码实现
void dfs(int h,string s,set &ans){
if(h==s.size()-1){//递归边界
ans.insert(s);//找到一个排序,并且插入
return ;
}
for(int i=h;i
dfs(h+1,s,ans);//进入下一层递归
swap(s[i],s[h]);//还原s
}
}
NC.19.连续子数组的最大和
题目描述:一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
2022.3.11—Hou:暴力法,算法思路应该正确,但由于暴力法时间复杂度太高,于是没有通过。----看题解的方法,懂了,dai代码实现。
2022.3.12----运用动态规划法,自己代码实现了。
LC.128.最长连续序列
题目描述:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
2022.3.19:Hou:想到暴力算法:对数组排序+遍历,但此方法超时。
NC.17.最长回文子串、LC.5.最长回文子串
题目描述:对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。
2022.3.10
NC.41.最长无重复子数组
题目描述:给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的。
2022.3.12:Hou:“暴力算法:双重遍历,每一次申请一个Set集合,计算此过程中最大的个数”,代码通过,但此方法不好。
JZ16 数值的整数次方题目描述:实现函数 double Power(double base, int exponent),求base的exponent次方。 public double Power(double base, int exponent) { }。
2022.1.25—不会,答案懂了—SK:递归法。
LC.343.整数拆分
2022.3.22:不会。-----看题解,懂了,dai代码实现。
2022.4.5:Hou:“没思路”。—看题解,懂了。
JZ59.滑动窗口的最大值 、LC.239. 滑动窗口最大值、
LC.209.长度最小的子数组
【myTag】矩阵中元素。
NC.BM57岛屿数量
题目:给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
LC.136.只出现一次的数字
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
2022.3.19:只能想出暴力法。-------看了答案,懂了。
LC.53.最大子数组和
2022.3.21:Hou:自己想出了算法,代码实现了。
LC.152.乘积最大子数组
2022.3.21:Hou:此题目和LC.53很像,于是只改了符号,结果提交通过109 / 188。--------看了题解
,明白了自己这样做少考虑了情况,懂了,dai代码实现。
"下一个更大的"题型】
LC.739.每日温度
2022.3.26:Hou:懂了题解思路:单调栈,自己用代码实现了。
LC.496.下一个更大元素 I
LC.503.下一个更大元素 II
LC.42.接雨水
参考《代码随想录》
LC.55.跳跃游戏
LC.55. 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。
2022.4.7:Hou:想到了用回溯法,用代码实现了,自己测试了几个例子,是正常的,但是leecode平台提交显示超时了,说明自己回溯法的实现时间复杂度高。别人的题解中好像都没有用回溯法的。
LC.860.柠檬水找零
2022.4.8:通过测试用例:40 / 60
LC.763.划分字母区间
LC.763.划分字母区间
题目描述:字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
LC.31.下一个排列
题目简述:题目给[ 1,2,3],应该返回答案[1,3,2]。
31.下一个排列–题解。
【Tag】模拟。发现隐藏的规律。
2022.11.5—只想到了暴力算法,而且好像还不会暴力实现。看了题解,看懂了。
LC.56.合并区间
LC.56.合并区间自述题目:Input: Intervals = {{1,3},{2,4},{6,8},{9,10}},合并重叠区间,Output: {{1, 4}, {6, 8}, {9, 10}}
LC.56.合并区间题解 题解亮点:Interval类型表示数组;用Arrays.sort()和Comparator对二维数组进行按照左端点排序;用Stack集合。
2022.11.7我的算法如下(评价自己的算法:大致思路正确,但自己用代码实现估计有点难度,去学学题解代码写法。)
根据intervals[i][0]比大小排序
for i to intervals.length-1
if intervals[i][1]> intervals[i+1][0]
if intervals[i][1]>intervals[i+1][1]
删去intervals[i+1]
else
一个新生成的数:intervals[i][0]和intervals[i+1][1]
else
continue
LC.322.零钱兑换
LC.322.零钱兑换
自述题目:硬币数组coins,每种硬币无限多,计算并返回可以凑成总金额amount所需的最少的硬币个数。输入:coins = [1, 2, 5], amount = 11。输出:3 。解释:11 = 5 + 5 + 1。
2022.11.8我的算法:
对coins内数字排序,从后往前回溯思想。自己用代码实现了,但是力扣的测试用例过不去,不知为啥。
2022.11.9看了题解后,LC.322.零钱兑换—题解自己复述一遍算法。(感觉自己把算法看懂了,但是代码实现后,有的测试没通过,dai排查错误)
new int dp[amount+1];
dp[i]含义是:兑换i元所需要的最少硬币;
dp[0]=0;
dp[1]=-1;
for i=1 to amount
for j=0 to coins.length-1
if(dp[i]-coins[j]>=0)
dp[i]=min{dp[i],dp[i-coins[j]]}
return dp[amount]