LeetCode
Heroin_s
我得离开我的沙发
展开
-
LeetCode(中等) 二叉树的最近公共祖先(c#)
LeetCode(中等) 二叉树的最近公共祖先(c#)题目为 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。思路为深度遍历,最近的公共祖先就是左右两个子树都分别存在符合节点。函数返回值为存在对应节点返回对应值,不存在和不是父节点返回空 ,代码如下 public TreeNode LowestCommon原创 2021-11-10 17:15:24 · 489 阅读 · 0 评论 -
LeetCode(简单) 对称二叉树(c#)
工作忙,很久没有刷题了,趁着不忙刷道简单题,题目为 给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。思路递归子节点对称判断是否相等,代码如下 public static bool IsSymmetric(TreeNode root) { return GetTreeNode(root, root); } public static bool GetTreeNode(TreeNo原创 2020-11-28 12:23:56 · 312 阅读 · 0 评论 -
LeetCode(中等) Pow(x, n)(c#)
题目为 实现 pow(x, n) ,即计算 x 的 n 次幂函数。思路一开始的代码直接用Math.Pow()返回了,后来觉得不妥,看了题解,理解了思路,减少了乘的次数代码如下 public double MyPow(double x, int n) { return n>0? PowDetail(x, n):1/ PowDetail(x, n); } public double PowDetail(double x,原创 2020-07-28 10:13:23 · 180 阅读 · 0 评论 -
LeetCode(简单) 二叉树的最大深度(c#)
题目为 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。思路为 递归遍历,如果为无子节点的叶子节点,那么与之前存储的长度比较。代码为 public int MaxDepth(TreeNode root) { GetDeptMax(root,0); return AllMax; } int AllMax = 0;原创 2020-07-28 09:04:29 · 169 阅读 · 0 评论 -
LeetCode(困难)跳跃游戏 II(c#)
题目为 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。一开始的思路为递归回溯出所有的可能性,找到所有的情况下的最小值,代码如下 (超时) public int Jump(int[] nums) { if (nums.Count()==0) { return 0; }原创 2020-07-24 20:23:50 · 182 阅读 · 0 评论 -
LeetCode(困难)解数独(c#)
题目为 编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。思路是递归,代码注释应该已经逻辑很清楚了 //九列 List<Dictionary<int, bool>> liCol = new List<Dictionary<int, bool>>原创 2020-07-24 15:05:53 · 592 阅读 · 0 评论 -
LeetCode(简单) 除数博弈(c#)
题目为 爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。这种游戏没做过,没有思路。看了评论,才明白其实就是抢2,代码如下 public bool Di原创 2020-07-24 10:09:56 · 168 阅读 · 0 评论 -
LeetCode(中等)最小路径和(c#)
题目为 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。这题和之前的地下城游戏思路差不多,但是比之前那个简单,我是从终点向起点遍历,选取最小路径值,代码和注释如下 public int MinPathSum(int[][] grid) { if (grid==null) { return 0;原创 2020-07-23 14:37:02 · 161 阅读 · 0 评论 -
LeetCode(中等)不同的二叉搜索树 II(c#)
题目为 给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。就是递归遍历,代码如下 public IList<TreeNode> GenerateTrees(int n) { if (n==0) { return new List<TreeNode>(); } return GetAllTree(1, n);原创 2020-07-22 19:45:14 · 107 阅读 · 0 评论 -
LeetCode(困难)戳气球(c#)
题目为 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实原创 2020-07-22 14:54:29 · 206 阅读 · 0 评论 -
LeetCode(困难)交错字符串(c#)
题目为 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。思路为深度递归,代码复杂度 2^n n为s3的长度 代码如下 未通过 超时 public bool IsInterleave(string s1, string s2, string s3) { if (s3.Length!=(s1.Length+s2.Length)) { return false; }原创 2020-07-20 14:42:01 · 125 阅读 · 0 评论 -
LeetCode(简单) 两数之和 II - 输入有序数组(c#)
题目为 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。思路 键值对存储,判断是否目标值减去该数的结果已经存在,代码如下 public int[] TwoSum(int[] numbers, int target)原创 2020-07-20 08:57:48 · 130 阅读 · 0 评论 -
LeetCode(中等)股票的最大利润(c#)
题目为 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路同之前股票文章 买卖股票最佳时机代码为 public int MaxProfit(int[] prices) { if (prices.Length <= 1) { return 0; } int n = prices.Length;原创 2020-07-16 20:23:39 · 164 阅读 · 0 评论 -
LeetCode(中等)买卖股票的最佳时机含手续费(c#)
题目为 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。思路参考之前股票文章 买卖股票的最佳时机 III代码如下 public int MaxProfit(int[] prices, int f原创 2020-07-16 20:17:34 · 170 阅读 · 0 评论 -
LeetCode(中等)最佳买卖股票时机含冷冻期(c#)
题目为 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。思路与之前股票思路相同,但是状态变为三个//0:不持股 可买入 1:持股 2:不持股 不可买入最后返回不持股的所有状态代码如下 public int MaxProfit(int[] price原创 2020-07-16 20:06:42 · 103 阅读 · 0 评论 -
LeetCode(困难)买卖股票的最佳时机 IV(c#)
题目为 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。延续之前的思路 LeetCode(困难)买卖股票的最佳时机 III(c#)代码为如下 下列代码执行存在超出内存的情况 public int MaxProfit(int k, int[] prices) { if (prices.Length &原创 2020-07-16 17:42:59 · 127 阅读 · 0 评论 -
LeetCode(困难)买卖股票的最佳时机 III(c#)
题目为 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。思路参考精选题解,对应股票问题都是一个思路。精选题解三维数组,[i,k,w]分别对应 i:天数 k:交易次数 w:持有状态(1:持有 0:未持有) public int MaxProfit(int[] prices) { if (prices.原创 2020-07-16 17:16:08 · 166 阅读 · 0 评论 -
LeetCode(中等)组合总和 II(c#)
题目为 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。与组合总数逻辑差不多,不过递归时,不能给for的开始位数传当前的i了,要加一,然后加个键值对去判断是否存在重复。代码如下 IList<IList<int>> res = new List<ILis原创 2020-07-16 14:56:02 · 167 阅读 · 0 评论 -
LeetCode(中等)组合总和(c#)
题目为 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。DFS直接遍历,代码如下 IList<IList<int>> res = new List<IList<int>>(); Dictionary<原创 2020-07-16 14:46:58 · 156 阅读 · 0 评论 -
LeetCode(困难)地下城游戏(c#)
题目为 一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加原创 2020-07-15 20:16:16 · 165 阅读 · 0 评论 -
LeetCode(中等)不同的二叉搜索树(c#)
题目为 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?思路为 动态规划,分别让每个节点当父节点,将左右再继续递归。最终结果就是左侧乘以右侧。代码如下 public int NumTrees(int n) { if (n == 0) { return 1; } if (n < 3) {原创 2020-07-15 15:20:33 · 96 阅读 · 0 评论 -
LeetCode(困难)计算右侧小于当前元素的个数(c#)
题目为 给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。做这题前,首先应掌握归并排序归并排序介绍以及代码,然后做一下数组中的逆序对这道题,之后做这道题会理解的很快。思路如下,归并排序,操作数组排序同时,新建一个数组记录元素位置,对元素排序时同时对该位置数组同样操作,这样可以记录元素位置,然后比较大小,直接根据位置,向结果数组中添加数量就可以了。一开始的代码如下,第一次原创 2020-07-15 10:53:07 · 205 阅读 · 0 评论 -
LeetCode(中等)三角形最小路径和(c#)
题目为 给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。开始的思路为递归,按照类似深度遍历的方式去遍历整个列表。复杂度较高,代码执行至倒数第二个案例超时,代码如下/*给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。*/原创 2020-07-14 18:18:29 · 171 阅读 · 0 评论 -
LeetCode(困难)数组中的逆序对(c#)
题目为 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。这道题可以当作例题做,思路为归并排序。不理解什么是归并排序可以看我的文章 排序算法之插入排序、希尔排序、归并排序(C#)。当两个有序数组进行合并时,左侧有比右侧大的元素,则左侧该元素之后所有之后的元素均为逆序对。一开始我的代码为public class Solution { public int ReversePairs(int[] nums) {原创 2020-07-13 20:09:00 · 192 阅读 · 0 评论 -
LeetCode(简单)两个数组的交集 II(c#)
题目为 给定两个数组,编写一个函数来计算它们的交集。很简单的一道题,用键值对存储第一个数组的元素,以及元素的出现次数。然后遍历第二个数组,出现了就添加到结果集,并将键值对出现次数减1。代码如下 public int[] Intersect(int[] nums1, int[] nums2) { Dictionary<int, int> dic = new Dictionary<int, int>(); List&原创 2020-07-13 08:55:57 · 172 阅读 · 0 评论 -
LeetCode(简单)买卖股票的最佳时机II(c#)
题目为 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一开始我的思路为,动态规划,数组存储对应每日所赚取的最大值,第一日肯定为0,那么第二天就等于第二天的减去之前天数的所有差值的最大值,对比第一天的赚取值。 取最大的。看了题解之后,发现其实很简单。只记录上涨的值,求和就可以了 。代码如下 public int Max原创 2020-07-10 17:39:20 · 243 阅读 · 0 评论 -
LeetCode(简单)买卖股票的最佳时机(c#)
题目为 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。思路很简单,遍历数组,存储该节点前的最小值,还要在遍历时存储该节点减去该节点前的最大值。代码如下 public int MaxProfit(int[] prices) { int beforeMin = int.MaxValue;原创 2020-07-10 16:13:51 · 198 阅读 · 0 评论 -
LeetCode(简单)只出现一次的数字(c#)
题目为 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?一开始我的思路是对数组排序,然后遍历,比较数组前一个和后一个是否都不相等。代码如下 public int SingleNumber(int[] nums) { if (nums.Count()==1) { return nu原创 2020-07-10 15:30:08 · 239 阅读 · 0 评论 -
LeetCode(中等)字母异位词分组(c#)
题目为 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。思路一开始为,遍历集合,对每个元素计算全排列的所有可能集合。代码如下。很长(复杂度较高,执行超时,可以跳过,直接看第二个解法) public IList<IList<string>> GroupAnagrams(string[] strs) { bool falgNull = false; int nullCount原创 2020-07-10 14:48:54 · 175 阅读 · 0 评论 -
LeetCode(中等)恢复空格(c#)
题目为 哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意:本题相对原题稍作改动,原创 2020-07-09 16:37:29 · 178 阅读 · 0 评论 -
LeetCode(中等)全排列II(c#)
题目为给定一个可包含重复数字的序列,返回所有不重复的全排列。思路为,相比较与全排序题目,增加了数组包含重复数。思路为键值对判断重复。代码如下 public IList<IList<int>> PermuteUnique(int[] nums) { List<int> temp = new List<int>(); IList<IList<int>> res = n原创 2020-07-09 15:38:43 · 140 阅读 · 0 评论 -
LeetCode(中等)全排列(c#)
题目为 给定一个 没有重复 数字的序列,返回其所有可能的全排列。这道题之前没有了解过回溯法,看了题解,学习了思路。精选题解链接:这个精选讲解的很好题解里有这一张图,可以让你直接看懂回溯算法时间复杂度:O(N×N!)C#代码如下 public IList<IList<int>> Permute(int[] nums) { IList<IList<int>> res = new List<IList&原创 2020-07-08 11:33:21 · 163 阅读 · 0 评论 -
LeetCode(简单)跳水板(c#)
题目为 你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。逻辑为,特殊条件判断k=0时,返回空数组。长短相等时,返回一个值就可以;代码如下 public int[] DivingBoard(int shorter, int longer, int k) { if (k==0)原创 2020-07-08 09:15:29 · 172 阅读 · 0 评论 -
LeetCode(简单)路径总和(c#)
题目为 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。思路为 很明显的深度遍历,叶子节点位置处判断总和。一开始的代码为如下代码 public bool HasPathSum(TreeNode root, int sum) { if (root == null) { return false;原创 2020-07-07 14:55:51 · 179 阅读 · 0 评论 -
LeetCode(困难)接雨水(c#)
题目为 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。思路将数组的位置以及值存储到键值对中,并排序。找到最高点,分别向左、右计算水量,水量为最低的边乘以距离。减去两边之间的数组值,代码如下 public int Trap(int[] height) { if (height==null||height.Count()==0) { return 0;原创 2020-07-07 11:48:29 · 207 阅读 · 0 评论 -
LeetCode(中等)有效的数独(c#)
题目为 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。思路为两次for循环,遍历数组,对使用集合存储键值对,分别的列、行、九宫格进行判断。代码如下 public bool IsValidSudoku(char[][] board) { List<Dictionary<原创 2020-07-06 16:42:52 · 221 阅读 · 0 评论 -
LeetCode(中等)不同路径II(c#)
题目为 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?一开始考虑的思路是按照广度遍历去搜索,但对于递归,由于数组数量的增加,递归占用内存较多,所以会超时,但我觉得这也是一种思路,代码如下 public int UniquePathsWithObstacles(int[][] obsta原创 2020-07-06 14:52:13 · 98 阅读 · 0 评论 -
LeetCode(中等)最长重复子数组(c#)
题目为 给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。第一种解法,暴力算法,时间复杂度N^3。此解法leetcode会超时。但逻辑没有问题,c#代码如下public int FindLength(int[] A, int[] B) { int Maxlength = 0; for (int i = 0; i < A.Length; i++) { //List<int原创 2020-07-02 17:31:50 · 137 阅读 · 0 评论 -
LeetCode(困难)串联所有单词的子串(c#)
题目为 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。第一个思路为用一个全为0的字符串去存储每一个元素是否出现过,出现就变为1。进行判断。属于暴力算法,代码逻辑没有问题,但是超时了。代码如下 public IList<int> FindSubstring(string s, string[] word原创 2020-06-28 17:57:28 · 190 阅读 · 0 评论 -
LeetCode(中等)长度最小的子数组(c#)
题目为 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。注意 题目中的连续子数组为数组中的连续,而不是将数组排序后,数组值为连续的才可以。 思路为 一开始写的暴力算法, public int MinSubArrayLen(int s, int[] nums) { int count = nums.Length; int s原创 2020-06-28 11:06:06 · 146 阅读 · 0 评论