![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
自学数据结构与算法的相关总结
KGF886
希望我的文章对您有一点点的帮助或启发。
展开
-
LC-买卖股票最佳时机
一开始我看这题属于动态规划,直接想着二维数组求解,先画下数组再写代码,写完提交,发现内存超出限制,想着二维太大,进行降维,降成一维后提交,显示时间超时了,把代码优化了一下,还是超时,所以肯定是两次嵌套循环太耗时,只能想着用一次遍历去解决了。计算公式:比如第一行第三列:是等于当天的价格5,减去买入的价格7,第二行第三列:当天价格5,减去买入的价格1,怎么知道买入的价格?第二行是第一天买入股票然后每天卖掉得到的收益,如第一天买入,收益-7,第二天卖掉就是第二天的价格-买入的价格=1-7=-6;原创 2023-08-23 19:45:00 · 229 阅读 · 0 评论 -
LC-路径总和
判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。做题前还是应该认真审题,本题在做之前没有看仔细,导致几次没有通过,一次是没注意必须走到叶子节点,一次是想着当前的值大于还需要的值时就返回,导致值为负数时的例子通不过。输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22。解释:由于树是空的,所以不存在根节点到叶子节点的路径。不存在 sum = 5 的根节点到叶子节点的路径。原创 2023-08-21 20:45:00 · 178 阅读 · 0 评论 -
LC-平衡二叉树
根据平衡二叉树定义,我们只需要遍历树的每个节点,获取他的左右子树的高度差,然后判断是不是平衡二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。输入:root = [1,2,2,3,3,null,null,4,4]输入:root = [3,9,20,null,null,15,7]:给定一个二叉树,判断它是否是高度平衡的二叉树。输入:root = []原创 2023-08-21 19:15:00 · 83 阅读 · 0 评论 -
LC-将有序数组转换为二叉搜索树
如果数组长度是奇数,则根节点的选择是唯一的,如果数组长度是偶数,则可以选择中间位置左边的数字作为根节点或者选择中间位置右边的数字作为根节点,选择不同的数字作为根节点则创建的平衡二叉搜索树也是不同的。如果没有要求二叉搜索树的高度平衡,则任何一个数字都可以作为二叉搜索树的根节点,因此可能的二叉搜索树有多个。确定平衡二叉搜索树的根节点之后,其余的数字分别位于平衡二叉搜索树的左子树和右子树中,左子树和右子树分别也是平衡二叉搜索树,因此可以通过递归的方式创建平衡二叉搜索树。输入:nums = [1,3]原创 2023-08-18 21:15:00 · 123 阅读 · 0 评论 -
LC-二叉树最大深度
思路:对于叶子节点,如9,15和7来说,他们的左右节点为空,可以认为他们的深度是1,;等于20,左右节点都有值,且他们深度是1,则20的深度就是2;等于根节点3,他的左节点深度是1,右节点20的深度是2,则对于3的最大深度是2+1。所以某节点的最大深度就是他左右节点深度最大值再加1。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。输入:root = [3,9,20,null,null,15,7]给定一个二叉树 root ,返回其最大深度。输入:root = [1,null,2]原创 2023-08-18 20:15:00 · 90 阅读 · 0 评论 -
LC-对称二叉树
以例1为例,想要树是对称的,是对于根节点1来说,左2应该等于右2;等于左2跟右2来说,左2的左3是等于右2的右3,左2的右4等于右2的左4,依次类推。描述:给你一个二叉树的根节点 root , 检查它是否轴对称。输入:root = [1,2,2,null,3,null,3]输入:root = [1,2,2,3,4,4,3]原创 2023-08-18 19:45:00 · 127 阅读 · 0 评论 -
LC-相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。输入:p = [1,2], q = [1,null,2]输入:p = [1,2,3], q = [1,2,3]输入:p = [1,2,1], q = [1,1,2]通过中序遍历,判断树的结构和节点的值是否相同。原创 2023-08-17 19:30:00 · 88 阅读 · 0 评论 -
LC-合并两个有序链表(解法1)
这题不是很难,我们可以新建个链表,然后遍历两个链表,将他们的值进行比较,小的就添加进新链表,然后后移一位,再进行比较。以例1为例,我们先将l1的1和l2的1比较,相等就将l1的1添加进新链表,然后后移,将l1的2与l2的1比较,l2的值小,将1添加进新链表,然后后移一位,下面就比较l1的2和l2的3,以此类推。输入:l1 = [1,2,4], l2 = [1,3,4]输入:l1 = [], l2 = [0]输入:l1 = [], l2 = []输出:[1,1,2,3,4,4]原创 2023-08-16 19:45:00 · 57 阅读 · 0 评论 -
LC-链表的中间节点(双指针)
思路:使用快慢指针,慢指针一次走一步,快指针一次走两步,这样当快指针走到链表尾部时,慢指针所在节点就是中间节点。描述:给你单链表的头结点 head ,请你找出并返回链表的中间结点。解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。双指针是比前面遍历和递归都要好的方法,代码量较少,使用内存也较小。输入:head = [1,2,3,4,5,6]输入:head = [1,2,3,4,5]解释:链表只有一个中间结点,值为 3。输出:[3,4,5]输出:[4,5,6]原创 2023-08-15 22:15:00 · 106 阅读 · 0 评论 -
LC-链表的中间节点(递归)
可以看见第一个节点没有参与,因为我们(head = head.next)跳过了第一个节点,是最后null为最后一个节点,所以我们把index/2后需要将下标向前移动一位。nodeIndex必须定义为局部变量,这样才能跟随节点,如果我们定义在方法里,跟index一样去增加,那递归返回时会发现每个节点下标都一样。解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。输入:head = [1,2,3,4,5,6]输入:head = [1,2,3,4,5]输出:[3,4,5]输出:[4,5,6]原创 2023-08-15 21:45:00 · 113 阅读 · 0 评论 -
LC-相交链表(解法2)
我们假设除了相交的长度为a,相交的长度为c,则A的长度为LA= a+c,同理,LB=b+c。我们让他们走到链表尾部的时候回到另外链表的头部,这样他们可以同时走到相交的节点。这时LA=a+c+b,LB=b+c+a。如果a,b的节点一直没有相同,则他们不相交,返回null。:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。注意,函数返回结果后,链表必须 保持其原始结构。:这题还可以使用双指针求解。原创 2023-08-15 20:15:00 · 104 阅读 · 0 评论 -
LC-相交链表(解法1)
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。思路:我们可以先获取两个链表的长度,以短的为准开始遍历两个链表,进行比较,当所指节点一样时,说明有相交,如果一直不相等则没有相交。此解法代码相对较多,容易理解一点,下一篇通过双指针求解。注意,函数返回结果后,链表必须 保持其原始结构。题目数据 保证 整个链式结构中不存在环。原创 2023-08-15 19:45:00 · 102 阅读 · 0 评论 -
LC-环形链表(找环的入口)
快慢指针一个起点,快指针的速度是慢指针的2倍,所以快指针走的距离也是慢指针的2倍,快 - 慢 = 慢,2b步就是多走的,那么慢指针走的就是2b步。另外,走a+nb步都是停在环的入口处,所以相遇后再走a步(a+2b)会走到入口,但是我们不知道a是多少,可以让一个指针(比如慢指针)回到起点,:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。然后两个指针每次都是走一步,走a步后就会在入口处相遇。思路:我们设起点到环入口是a步,环是b步,多走k步。例如慢指针走的是:a + 0 + k。原创 2023-08-14 18:45:00 · 202 阅读 · 0 评论 -
LC-环形链表
如果一个链表有环,当它进入环之后,就会沿着环一直走,这时如果我们新增一个指针,让他沿着链表走,某时某刻他们就会相遇,肯定需要一个快一个慢,这样才会快的追上慢的,如果每次移动的距离一样肯定不行。a指针首先在3处,b在0处,我们对比这两个节点是否相等(节点的值可能一样,所以不能拿节点的val去对比)。如果相等,说明有环;如果不相等,a向后移动到2,b向后移动2步也到2;这时判断a和b就是一样,所以有环。:给你一个链表的头节点 head ,判断链表中是否有环。我们创建a,b两个指针,a是慢指针,b是快指针。原创 2023-08-11 14:18:45 · 104 阅读 · 0 评论 -
LC-删除排序链表中的重复元素
这题其实不难,链表已经排序,我们只要把相邻的两个节点的值进行比较,如果相同,删除后面的节点(将当前节点的next指针指向它的下一个节点的下一个节点,这样当前节点的下一个节点就没有指针指向它,也就脱离了当前链表),如果不相同,指针后移一位。这里我新增一个头节点,因为返回的时候是返回第一个节点,相当于记住头在哪,返回的时候就是返回它的下一个节点。原创 2023-08-10 22:00:00 · 122 阅读 · 0 评论 -
LC-杨辉三角-记忆版
我们可以看到计算a[5][3]和a[5][4]时都需要a[4][3]的值,之前我们是需要每次用到都重新计算,这样就比较耗时,有没有办法记住已经算过的值呢,当下次用的时候直接获取就不用重新计算了,以空间来换取时间。我们可以新增一个二维数组,把计算的结果放到数组中,每次计算前先查看一下数组中是否存在,如果已存在就获取值,不存在再计算。原创 2023-08-10 21:30:00 · 154 阅读 · 0 评论 -
LC-杨辉三角
最后我们需要找到任意位置的数字是多少的规律,比如我们想要知道第i行第j列的数字是多少。我们看第3行第2列的2是由第2行第1列的1和第2行第2列的1加起来;第5行第3列的6是由第4行的第2列和第4行的第3列3加起来,所以。所以第n行的数据是根据它上一行的数据计算来的,也就是第n行数据是是由第n-1行数据计算来的。第三行的2就是它肩膀上两个1之和,其余的类似。靠一边之后,是一个n行n列的排列,下面我们来看下存在的一些规律。上图就是一个杨辉三角,每个数等于他左上角的数与右上角的数之和。原创 2023-08-10 21:00:00 · 140 阅读 · 0 评论 -
二分查找-Java
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。原创 2023-07-29 10:25:43 · 135 阅读 · 0 评论 -
Java数据结构与算法--稀疏数组
某些场景下,二维数组保存的值大多数为0,只有少量不为0的值。这种情况下,没有意义的值(为0的数据)较多,我们可以将它压缩为较小的数组,保存其中有意义的值即可。常见的场景就是保存围棋、五子棋等的残局。网上说明挺多,可自行查找。数据结构与算法 栏目是本人自学时做的相关笔记与总结,有兴趣的可以关注查看。原创 2023-07-27 17:10:48 · 227 阅读 · 0 评论 -
LC——返回倒数第k个节点
LC——返回倒数第k个节点题目链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci/实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。示例:输入: 1->2->3->4->5 和 k = 2输出: 4思路:遍历链表,将值放入集合里,获取倒数第k位的值(集合长度-k=倒数k位的下标)代码: public static int kthToLast(ListNode head原创 2022-03-03 09:18:59 · 233 阅读 · 0 评论 -
LC——移除重复节点
Lecode——移除重复节点题目链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]思路:其实就是去重,想到集合Set就是可以用来去重。一开始想的是通过HashSet来存,然后遍历去取值,但是HashSet是无序的(存入的顺序和取的顺序不一样),然后想起LinkHashSet是有序的(原创 2022-03-02 18:30:46 · 201 阅读 · 0 评论 -
LC——旋转字符串
LC——旋转字符串题目链接:https://leetcode-cn.com/problems/rotate-string/solution/xuan-zhuan-zi-fu-chuan-by-leetcode/要求:给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。s 的 旋转操作 就是将 s 最左边的字符移动到最右边。例如, 若 s = ‘abcde’,在旋转一次之后结果就是’bcdea’ 。 public boolean rota原创 2022-02-17 14:19:16 · 6813 阅读 · 0 评论 -
LC——最短无序连续子数组
LC——最短无序连续子数组题目链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/要求:给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。(这是目前提交次数最多,错的最多的题目,快十次了,可能一开始的想法就是错误的,导致解决了一个问题又出现另外的问题。一开始想的是从前往后遍历,出现原创 2021-12-09 19:30:00 · 273 阅读 · 0 评论 -
LC——寻找旋转排序数组中的最小值
LC——寻找旋转排序数组中的最小值题目链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/要求:已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0]原创 2021-12-08 09:08:50 · 167 阅读 · 0 评论 -
LC——删除排序数组中的重复项
LC——删除排序数组中的重复项题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/要求:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。代码: public int removeDuplicates(int[] nums) {原创 2021-12-07 21:45:00 · 420 阅读 · 0 评论 -
LC——移动零
LC——移动零题目链接:https://leetcode-cn.com/leetbook/read/array-and-string/c6u02/代码:public void moveZeroes(int[] nums) { int first = 0; int last = 1; while (last<nums.length){ if(nums[first] == 0 ){ if(nums原创 2021-12-07 10:36:16 · 159 阅读 · 0 评论 -
LC——最长公共前缀
LC——最长公共前缀题目链接:https://leetcode-cn.com/leetbook/read/array-and-string/ceda1/思路一:用第一个字符串的每一位跟后面的字符串对应的位置比较,如果全都一样就返回true,用一个字符串拼接上这个字符。代码:public String longestCommonPrefix(String[] strs) { if(strs.length == 1){ return strs[0];原创 2021-11-30 10:16:20 · 144 阅读 · 0 评论 -
LC——寻找数组的中心索引
LC——寻找数组的中心索引题目链接:https://leetcode-cn.com/problems/find-the-middle-index-in-array/public int pivotIndex(int[] nums) { int result = 0; for (int i = 1; i < nums.length; i++) { result+=nums[i]; } int left = 0;原创 2021-11-24 12:06:17 · 107 阅读 · 1 评论 -
LeetCode——整数转罗马数字
LeetCode——整数转罗马数字原创 2021-11-24 08:55:41 · 125 阅读 · 0 评论 -
LeetCode——罗马数字转整数
LeetCode——罗马数字转整数原创 2021-11-24 08:57:56 · 54 阅读 · 0 评论 -
LeetCode——回文数
LeetCode——回文数题目链接:https://leetcode-cn.com/problems/palindrome-number/方法1:转换为字符串,判断对应位置的数字是否一样代码:public class IsPalindrome { public static boolean isPalindrome(int x) { boolean isPalindrome = true; String s = String.valueOf(x);原创 2021-11-11 10:43:10 · 50 阅读 · 0 评论 -
LeetCode——两数相加
LeetCode——两数相加题目链接:https://leetcode-cn.com/problems/add-two-numbers/思路:相同位置上的数相加,小于10当前节点就存多少,大于10时,当前节点存0,下一个节点加1。类:public class ListNode { public int val; public ListNode next; public ListNode() { } public ListNode(int val) {原创 2021-11-08 11:09:38 · 65 阅读 · 0 评论 -
算法题总结
十二、算法1.给定升序数组,找到两个数使他们之和等于目标数原创 2021-07-02 17:08:09 · 73 阅读 · 0 评论 -
给定升序数组,找到两个数使他们之和等于目标数
给定升序数组,找到两个数使他们之和等于目标数例如:给定数组[2,4,7,9],找到两个数使他们之和等于9.返回[1,3]。使用“左右指针”,往中间靠拢。代码: public static int[] twoSum(int[] source, int target){ int left = 0;//左边指针起始位置 int right = source.length-1;//右边指针起始位置 while(left<right){原创 2021-07-02 17:05:24 · 529 阅读 · 0 评论