![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 59
Genius_J
喜欢编程的程序小白
展开
-
leetcode 279. Perfect Squares
一、题意给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。二、解法解法一:动态规划求排列数dp[i]代表和为i的最小完全平方数数量dp[0]=0dp[i]=min(dp[i],dp[i-j*j]+1)时间复杂度:O(n×n)O(n\times \sqrt n )O(n×n)空间复杂度:O(n)O(n)O(n)解法二:原创 2022-02-11 10:44:42 · 551 阅读 · 0 评论 -
leetcode 377. Combination Sum IV
一、题意给出一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。题目上对nums限制在正整数范围二、解法解法:动态规划求排列数dp[i]代表和为i的排列数dp[0]=1:只有当不选取任何数字时, 和才为 0,因此只有 1种排列。以nums中的每一个元素为开头,求其排列数量,即求i-nums[j]的排列数量dp[i-nums[j]],将其相加即为结果。时间复原创 2022-02-09 10:11:55 · 317 阅读 · 0 评论 -
leetcode 518. Coin Change 2
一、题意给一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。二、解法解法:动态规划dp[0]=1:只有当不选取任何硬币时,金额之和才为 0,因此只有 1种硬币组合。对于面额为coin 的硬币,当 coin≤i≤amount 时,如果存在一种硬币组合的金额之和等于 i - coin,则在该硬币组合中转载 2022-02-08 12:35:02 · 182 阅读 · 0 评论 -
leetcode 322. Coin Change
一、题意给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。二、解法解法:动态规划dp[i]表示金额为i的最少需要的硬币有多少个dp[i]=min(dp[i],dp[i-coins[j]]+dp[coins[j]]),dp[i]>0。从1开始到i求dp[i],就可以将i之间的结果都求好,dp[i]即为结果。时原创 2022-02-07 12:24:36 · 270 阅读 · 0 评论 -
leetcode 72. Edit Distance
一、题意给你两个单词word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符二、解法解法:动态规划dp[i][j]表示word1前i个字符变换到word2前j个字符的编辑距离。首先初始化dp[0][i]=i;dp[i][0]=i;因为将i个字符变成0个需要i步操作。判断word1[i]==word2[j]相等:则dp[i+1][j+1]=dp[i][j]; 没有增加一步操原创 2022-02-06 11:01:06 · 392 阅读 · 0 评论 -
leetcode 1143. Longest Common Subsequence
一、题意给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。二、解法解法:动态规划dp[i][j]代表从text1[1:i]和text2[1:j]最长公共子序列的长度(从起始下标1开始):text1[i]==text2[j]:dp[i][j]=dp[i-1][j-1]+1text1[i]!=text2[j]:dp[i][j]=max(dp[i-1][j],dp[i][j-1]) 为text2前一个字符匹配到text1原创 2022-02-05 10:17:05 · 431 阅读 · 0 评论 -
leetcode 392. Is Subsequence
一、题意给定字符串 s 和 t ,判断 s 是否为 t 的子序列。进阶:如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?二、解法解法一:双指针子序列只要保证在t中,s中字符相对顺序不变就行了。遍历t,与s[j]比较,若相等,j++,若不相等,继续遍历t。直到j>=s.size()或者遍历完t。时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)解法二原创 2022-02-04 11:37:18 · 538 阅读 · 0 评论 -
leetcode 300. Longest Increasing Subsequence
一、题意给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。二、解法解法:贪心+二分查找dp[i]dp[i]dp[i]代表长度为i的最长上升子序列的末尾元素的最小值,nums[j]>dp[i]:dp[++i]=nums[j]dp[++i]=nums[j]dp[++i]=nums[j]else:找到i,使得dp[i−1]转载 2022-02-02 15:35:46 · 97 阅读 · 0 评论 -
leetcode 516. Longest Palindromic Subsequence
一、题意给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。二、解法解法:动态规划dp[i][j]dp[i][j]dp[i][j]代表了i到j最长回文子序列的转载 2022-02-01 11:21:44 · 109 阅读 · 0 评论 -
leetcode 5. Longest Palindromic Substring
一、题意给你一个字符串 s,找到 s 中最长的回文子串。二、解法解法一:动态规划dp[i][j]dp[i][j]dp[i][j]代表了i到j是否是回文子串,由s[i]==s[j]和其之间字符子串dp[i+1][j−1]dp[i+1][j-1]dp[i+1][j−1]是否是回文子串以上是j-i>2的情况。dp[i][i]dp[i][i]dp[i][i]是回文子串dp[i][i+1]=s[i]==s[i+1]dp[i][i+1]=s[i]==s[i+1]dp[i][i+1]=s[i]==s转载 2022-01-31 10:34:07 · 91 阅读 · 0 评论 -
leetcode 62. Unique Paths
一、题意一个机器人位于一个m x n网格的左上角 。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?二、解法解法一:动态规划当前位置的路径数由左和上的路径数总和决定,f[i][j]=f[i−1][j]+f[i][j−1]f[i][j]=f[i-1][j]+f[i][j-1]f[i][j]=f[i−1][j]+f[i][j−1]时间复杂度:O(mn)O(mn)O(mn)空间复杂度:O(mn)O(mn)O(mn)解法二:排列组合到终点总共m+n-2步原创 2022-01-28 11:34:41 · 383 阅读 · 0 评论 -
leetcode 931. Minimum Falling Path Sum
一、题意给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:i - k <= r <= i + k,j - k <= c <= j + k 且(r, c) 在矩阵内。二、解法解法一:暴力求解时间复杂度:O(mnk2)O(mnk^2)O(mnk2)空间复杂度:O(mn)O(mn)O(mn)解法二:前缀和p[i][j]代表了(0,0)到(i-原创 2022-01-26 11:45:58 · 5488 阅读 · 0 评论 -
leetcode 931. Minimum Falling Path Sum
一、题意给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。二、解法解法:动态规划当前位置的最小和转载 2022-01-24 10:26:00 · 100 阅读 · 0 评论 -
leetcode 96. Unique Binary Search Trees
一、题意给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。二、解法解法一:动态规划二叉搜索树,种数由其左右子树决定,种数=左子树种数*右子树种数,因为左右子树的上元素个数有多种情况,所以G(i)=∑j=1iG(i−j)∗G(j−1)G(i)=\sum^i_{j=1}G(i-j)*G(j-1)G(i)=∑j=1iG(i−j)∗G(j−1)。时间复杂度:O(n2)O(n^2)O(n2)空间复杂度:O(n)O(n)O转载 2022-01-21 10:40:09 · 93 阅读 · 0 评论 -
leetcode 264. Ugly Number II
一、题意给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数就是只包含质因数 2、3 和/或 5的正整数。二、解法解法:动态规划设dp为丑数数组,设置三个下标l1=1,l2=1,l3=1,对于第i个丑数一定是min{dp[l1]*2,dp[l2]*3,dp[l3]*5},然后与dp[l1]*2,dp[l2]*3,dp[l3]*5对比,如果相等就对应下标加一。dp[1]=1时间复杂度:O(n)O(n)O(n)空间复杂度:O(n)O(n)O(n)三、代码解法: int nthUglyN转载 2022-01-21 10:15:12 · 95 阅读 · 0 评论 -
leetcode 91. Decode Ways
一、题意一条包含字母 A-Z 的消息通过以下映射进行了编码:A->1B->2…Z->26给出一串数字的字符串,对其进行解码,求有几种结果。如 “11106”可以解码成 A A J F(‘1’,‘1’,‘10’,‘6’)或者KJF(‘11’,‘10’,‘6’),但是不能分解成(‘11’,‘1’,‘06’),因为’06’不等于’6’二、解法解法:动态规划设f[i]代表s前i个字符的解码方案数:当取一个字符到i时,判断s[i]是否等于’0’,不是则加上f[i-1]当取转载 2022-01-18 09:40:50 · 103 阅读 · 0 评论 -
leetcode 413. Arithmetic Slices
一、题意如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。给你一个整数数组nums,返回数组nums中所有为等差数组的子数组(下标是连续的)个数。二、解法解法:差分+计数计算以nums[i]和nums[i-1]结尾的等差数列的数量cnticnt_icnti,逆序遍历所有nums[i]和nums[i-1]对,将结果加起来。以nums[i+1]和nums[i]结尾的等差数列的数量cnti+1=cnti+1cnt_{i+1}=cnt_{i}+1cnti+1=cnti转载 2022-01-17 10:38:07 · 124 阅读 · 0 评论 -
leetcode 42. Trapping Rain Water
一、题意给定 非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。二、解法解法一:动态规划对于下标i,下雨后水能到达的最大高度等于下标i两边的最大高度的最小值,下标 ii 处能接的雨水量等于下标 ii 处的水能到达的最大高度减去 height[i]。用两个数组,一个记录下标≤i\leq i≤i的最大高度leftMax,一个记录下标≥i\geq i≥i的最大高度rightMax。对于i,比较当前leftMax和rightMax的大小,取最小值,减去height[转载 2022-01-16 12:23:12 · 117 阅读 · 0 评论 -
leetcode 139. 单词拆分
一、题意给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。(不需要所有单词都能用上)二、解法解法:动态规划dp[i]表示前i个字符是否能拆分成若干个出现在字典中的单词。对于dp[i]由其子字符串dp[j](j<i)和到i-1的字符串是否能组成一个单词决定。用map存储wordDict单词dp[i]=dp[j]&&map.count(s.substr(j,i-j))i-j超过wordDict中单词的最大长度转载 2022-01-15 09:57:05 · 124 阅读 · 0 评论 -
leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee
一、题意给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。求获得利润的最大值。二、解法解法一:动态规划有两种状态:dp[i][0]:没有持股时的最大收益dp[i][1]:持股时的最大收益dp[i][0] 是前一天没有持股的最大收益dp[i-1][0]和今天将昨天的股票卖出所获得的最大收益dp[i-1][1]原创 2022-01-14 10:40:33 · 133 阅读 · 0 评论 -
leetcode 309. Best Time to Buy and Sell Stock with Cooldown
一、题意给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。1、你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。2、卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。设计一个算法计算出最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。二、解法解法:设置三种状态:dp[i][0]: 代表持有股票时的最大收益。dp[i][1]: 没有持有股票,处于冷冻期时的最大收益。dp[i][2]:没有持有股票 ,没有处于冷冻期时的最大收益。对于dp[i转载 2022-01-13 10:34:41 · 112 阅读 · 0 评论 -
leetcode 1014. Best Sightseeing Pair
一、题意给出一个整数数组values,求values[i]+values[j]+i−jvalues[i] + values[j] + i - jvalues[i]+values[j]+i−j 最大值。二、解法解法:1、将式子拆分成values[i]+ivalues[i]+ivalues[i]+i和values[j]−jvalues[j]-jvalues[j]−j2、遍历数组,一边求到i之前的values[i]+ivalues[i]+ivalues[i]+i的最大值maxN,一边求max(maxN+转载 2022-01-12 09:23:41 · 88 阅读 · 0 评论 -
leetcode 1567. 乘积为正数的最长子数组长度
一、题意给出一个整数数组 nums ,求连续相乘为正数的最大值,包括单个元素的情况。二、解法解法一:根据提示自己写的:1、判断是否是0,是则根据负数的数量的奇偶,计算长度:偶数,计算当前位置到start 位置的长度奇数,计算当前位置到第一个负数后位置的长度。2、判断是否是负数,是:是第一个负数,计算出之前的长度不是第一个负数,判断奇偶:1、奇数,计算出该负数之前的位置到start位置的长度,计算出第一个负数后位置到当前位置的长度,与最大值比较大小。2、偶数,如果是最后一个元素,则计转载 2022-01-11 10:25:12 · 288 阅读 · 0 评论 -
leetcode 152. 乘积最大子数组
一、题意给出一个整数数组 nums(整数数组) ,求连续相乘积的最大值(相邻下标加在一起),包括单个元素的情况。二、解法解法:因为是乘法,要考虑正负情况,正数的话,就是求根据之前的最大值求最大值,而负数,负数越小,乘以负数,反而有可能是最大值。在求到i为止最大值的同时,要求出到i为止最小值,为下次使用。max[i]=max{max[i−1]∗nums[i],nums[i],min[i−1]∗nums[i]}max[i]=max\{max[i-1]*nums[i],nums[i],min[i-1]转载 2022-01-10 11:17:18 · 196 阅读 · 0 评论 -
leetcode 918. 环形子数组的最大和
一、题意给出一个环形整数数组 nums(整数数组) ,求连续相加的最大值(相邻下标加在一起),包括单个元素的情况。二、解法解法:Kadane 算法:dp=max(A[j]+dp,0)dp=max(A[j]+dp,0)dp=max(A[j]+dp,0)两种情况:1、最大值没有跨尾部到首部,跟非环形做法一样。2、最大值跨尾部,即最大值是两边相加,而中间可能是最小值,求出数组中最小值。将所有元素相加减去最小值。3、比较1、2大小即为最大值。时间复杂度:O(n)O(n)O(n)空间复杂度:O(1转载 2022-01-10 09:29:40 · 241 阅读 · 0 评论 -
leetcode 53. 最大子数组和
一、题意给出一个整数数组 nums ,求连续相加的最大值(相邻下标加在一起),包括单个元素的情况。二、解法贪心算法。解法一:从头相加,并保存最大值,如果相加结果小于0,则sum=0。时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)解法二(分治法):将数组分成l到mid,mid+1到r,分别求出最大值,然后再根据l到mid到r,跨区域求出最大值,比较三个的大小。三、代码1、解法一int maxSubArray(vector<int>& num原创 2022-01-08 09:51:57 · 111 阅读 · 0 评论 -
leetcode 45.跳跃游戏 II
一、题意给出一个非负整数数组 nums ,数组中的每个元素代表在该位置可以跳跃的最大长度。使用最少的跳跃次数到达数组的最后一个位置。假设总是可以到达数组的最后一个位置。二、解法贪心算法。解法一:反向查找:从头开始找到第一个能到n-1位置的下标i,再从头开始找到第一个能到i的下标j,一直到回到起点。时间复杂度:O(n2)O(n^2)O(n2)空间复杂度:O(1)O(1)O(1)解法二(官方):从头开始遍历:end为当前能到达的最大下标位置,初始为0maxP= max(maxP,nums原创 2022-01-07 09:23:41 · 2239 阅读 · 0 评论 -
leetcode 55. 跳跃游戏
一、题意给定一个非负整数数组 nums ,你最初位于数组的第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。二、解法贪心算法。解法1:计算出i+nums[i]i+nums[i]i+nums[i]或目前最大值是否能到下个位置,如果能,则继续,不能则返回false。解法2(官方):计算出能到达最右的位置rightmost,如果当前坐标≤\leq≤rightmost,rightmost=max(rightmost,nums[i]+i)rightmost=原创 2022-01-06 08:57:40 · 1624 阅读 · 0 评论 -
LeetCode 740. 删除并获得点数
一、题意给你一个整数数组 nums ,每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除所有等于 nums[i] - 1和 nums[i] + 1的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。1<=nums.length<=2∗1041 <= nums.length <= 2*10^41<=nums.length<=2∗1041<=nums[i]<=1041 <= nums[i]原创 2022-01-05 10:21:56 · 3661 阅读 · 0 评论 -
leetcode 1367. Linked List in Binary Tree
题意:给出一棵二叉树和一个链表。如果在二叉树中,存在一条完全匹配链表中数值的路径,返回 True ,否则返回 False 。解法:我的解法:将链表保存在数组中,计算出kmp的模式数组,然后对树深度优先搜索,并对节点进行匹配。官方:以二叉树中的每个节点为起点往下遍历的路径是否有与链表相匹配的路径。对当前节点进行匹配,成功返回true,失败返回false。然后对其左右节点进行从头节点开始的链表匹配,递归操作。总结:官方方法更加简洁明了,自己的方法用了kmp,也算是对这了解了一些。kmp的模式数组转载 2020-10-17 16:28:53 · 90 阅读 · 0 评论 -
leetcode 1171. Remove Zero Sum Consecutive Nodes from Linked List
题意:给出一个链表的头节点 ,反复删去链表中由和为 0 的连续节点组成的序列,直到不存在这样的序列为止。删除完毕后,返回最终结果链表的头节点。解法:1:暴力解法将每个元素放到数组中,然后按顺序以每个节点为头结点求和,判断有没有和为0的,有删除相应的数组中的元素,然后从头开始遍历,直到没有和为0的序列。然后将剩下的数按顺序生成一个链表,返回。2:前缀求解法数组的顺序累加求和的每一次结果,如果出现相同则说明中间部分可以抵消。先生成一个虚拟头结点,指向头节点,将map中的0指向该节点,从链表头开始累转载 2020-10-08 16:35:21 · 134 阅读 · 0 评论 -
leetcode 142. Linked List Cycle II
题意:判断一个链表中有没有环,有返回环的起始节点。解法:用快慢指针判断是否是环,不是则返回NULL,是则返回相遇时的节点。然后另设一个节点指向头结点,两个节点同时走一步,走到相同的节点即为环的起始节点。设链表到环的起始节点的距离为x,环内起始节点到快慢指针相遇节点的距离为y,剩下距离为z。则2(x+y)=x+y+z+y2(x+y)=x+y+z+y2(x+y)=x+y+z+y,得到x=zx=zx=z。即第一次相遇时,距离起始节点的距离为x。总结:这一题还可以通过集合来求解,但是这种方法更简洁,空间转载 2020-10-03 15:18:02 · 127 阅读 · 0 评论 -
leetcode 1019. Next Greater Node In Linked List
题意:给出一个链表,下一个更大值:在当前节点后面第一个比它大的数。找出所有节点的下一个更大值,返回结果数组,没有比它大的值为0。解法:我的解法:初始化当前结果数组为0,将链表逆转,比较当前节点的值与下一个节点的值:1、 如果当前节点大,保存到结果数组中,同时设置一个压缩数组用于记录结果数组中相邻不相同的值,即当前值与左右不一样。2、如果下一个节点大,则在压缩数组中从后往前找比下一个节点的值大的数值,由保存结果,同时判断该值与压缩数组中的最后一个数是否相同,不同则保存到压缩数组中。别人的解法:转载 2020-09-20 16:42:12 · 95 阅读 · 0 评论 -
leetcode 445. Add Two Numbers II
题意:两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。假设除了数字 0 之外,这两个数字都不会以零开头。不能对列表中的节点进行翻转。解法:我的解法:建另外一个链表先从最高位到最低位进行相加存储,后面产生的节点插在前面节点的前面,然后遍历链表处理大于10的数和余数,最后要注意判断最后余数是否大于0,是则在最后新增一个节点存放余数,然后将链表翻转。官方解法:用两个栈存储数据后,输出相加,相加的结果产生一个节点,next指向前一转载 2020-09-13 15:47:33 · 90 阅读 · 0 评论 -
leetcode 25. K 个一组翻转链表
题意:给出一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。解法:1、预设一个节点,指向头节点。2、找到第k个节点并保存下一个节点knext后,如果当前节点为NULL停止操作;否则将第k个节点的next设置为NULL,然后对当前节点到第k个节点之间进行反转,将当前节点节点的前一个节点重新指向反转后的链表段的第一个节点,当前节点指向knext节点。3、重复上述操作,直到跳出。总转载 2020-09-12 16:24:12 · 87 阅读 · 0 评论 -
leetcode 147. Insertion Sort List
题意:对链表进行插入排序。解法:我的解法:1、先设置一个节点指向头节点2、cur为当前排序节点,每一次都对链表从头开始进行比较,找到第一个比cur的值大的元素,这个元素前一个位置pre1,元素的位置p,然后将cur前面的元素pre的next指向cur的下一个元素,cur放到p前面。cur改为pre的下一个元素。别人的解法:1、先设置一个节点指向头节点2、cur为当前排序节点,tail为已排好序的最后一个节点,先比较这两个的值,cur大则遍历下一个节点,cur小则从头开始对链表的元素进行比较,转载 2020-08-30 17:46:48 · 121 阅读 · 0 评论 -
leetcode 148. Sort List
题意:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。解法:用归并排序,先求出链表长度,自底向上将链表断开后重新合并。总结:这一题一开始想尝试用快排,将链表中的元素根据大小移到其前后,操作起来很复杂,最后还有一些例子没有通过。看了一下解法,用的是归并排序。原来用数组的时候,发现归并排序挺费空间的。这题用链表发现,不仅不费空间,操作起来比数组的排序要简单一些。链表的相关操作还是不熟练,比如将一个元素在链表中前后移动。...转载 2020-08-29 16:51:23 · 78 阅读 · 0 评论 -
leetcode 02.07. Intersection of Two Linked Lists LCCI
题意:求两个链表的交集,是引用相同,不是值相同,即后面引用了相同的链表。解法:我的解法:分别求出两个链表的长度,然后将长度长的先循环两个链表长度的差值次数,然后同时遍历找到相同的引用的开始点。别人的解法:用两个指针分别指向两个链表,然后开始遍历判断,无论哪个先遍历完,然后指向另一个链表进行遍历。(有点像将AB两个链表串联起来,一个是AB,另一个是BA,然后遍历,因为长度一样,排除了两个链表长度不一样带来的问题,保证AB和BA的尾部是对齐的。) ListNode* hA =headA;转载 2020-08-23 16:10:20 · 113 阅读 · 0 评论 -
leetcode 剑指 Offer 35. 复杂链表的复制
题意:将一个链表复制一遍后输出,这个链表除了next指针外,还有一个random指针,随机指向链表中的元素(包括自身或者)转载 2020-08-22 15:56:09 · 302 阅读 · 0 评论 -
LeetCode 109 Convert Sorted List to Binary Search Tree
题意:将一个值按从小到大排列的链表转换成一棵平衡二叉搜索树。解法:解法1、利用快慢指针法找到中间节点,然后将其赋给树的当前节点,然后左右子树进行递归,左子树在中间节点之前的范围内建立,右子树在中间节点之后的范围内建立。在找到中间节点时,要找到其前一个节点,将其next设置为NULL,使得链表分为两部分,便于接下来的遍历。解法2、转换为数组后,找中间节点,然后确定左右子树范围,然后递归。解法3、中序遍历的思想,计算出链表长度,然后计算范围,进行中序遍历,判断当前是否符合条件,符合则节点赋值,这时链表转载 2020-08-16 16:12:05 · 117 阅读 · 0 评论