C#题解
包含来自leetcode与牛客的一些热门题目
luluvx
这个作者很懒,什么都没留下…
展开
-
[中等]2. 两数相加
【代码】[中等]2. 两数相加。原创 2023-12-10 16:59:59 · 81 阅读 · 0 评论 -
LeetCode [中等]矩阵置零
使用两个额外的变量记录原矩阵的第一行第一列是否包含0。之后便可以修改matrix[0][j]和 matrix[i][0]的数据。用原矩阵的 第一行 matrix[0][j] 和第一列 matrix[i][0],来代替原来的两个标记数组,从而减少使用的空间。空间复杂度:O(m+n),其中 m 是矩阵的行数,n 是矩阵的列数。时间复杂度:O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。时间复杂度:O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。用两个标记数组分别记录每一行和每一列是否有零出现。原创 2023-12-05 11:31:13 · 423 阅读 · 0 评论 -
LeetCode [中等]最大子数组和-动态规划
n 为数组长度,在 [0, n] 区间需要计算以每个中间元素 i 为结尾的最大和的非空子数组,并在这n个子数组中找到具有最大和的非空子数组。贪心算法:若当前指针所指元素之前的和小于0,则丢弃当前元素之前的数列。动态规划:若下一个元素大于0,则将其加到当前元素上。时间复杂度和空间复杂度都是 O(n)。动态规划的状态转移方程。原创 2023-12-05 10:04:35 · 415 阅读 · 0 评论 -
LeetCode [中等]岛屿数量
空间复杂度:O(mn),其中 m 和 n 分别是网格 grid 的行数和列数。记录每个元素是否被访问过的二维数组和递归调用栈需要 O(mn) 的空间。时间复杂度:O(mn),其中 m 和 n 分别是网格 grid 的行数和列数。深度优先搜索最多需要访问每个元素一次。找到值为1的节点之后递归调用DFS遍历,并使用与地图数据结构相同的二维数组visited来保存该点是否访问过。原创 2023-12-04 13:11:37 · 232 阅读 · 0 评论 -
LeetCode [中等]全排列(回溯算法)
在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。由于当 index = 0 时,排列中的所有元素都尚未确定,因此对于任意 0≤ index < n,都可以将 temp[index] 和任意一个下标大于等于 index 的元素交换,经过一次交换之后即可确定当前排列中 temp[index] 的值。当每个下标对应的所有可能的值都遍历结束时,即可得到数组 nums 的全排列。原创 2023-12-04 14:49:25 · 384 阅读 · 0 评论 -
LeetCode [中等]二叉树的右视图(层序
从二叉树的层序遍历改进,根右左。原创 2023-12-03 10:04:42 · 87 阅读 · 0 评论 -
LeetCode [中等]98. 验证二叉搜索树
给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。原创 2023-12-01 10:12:50 · 174 阅读 · 0 评论 -
将有序数组转换为二叉搜索树
每次都将根结点值取为中间位置左边的下标处的值。原创 2023-12-01 09:07:24 · 38 阅读 · 0 评论 -
C# IList 与List区别&二叉树的层序遍历
【代码】二叉树的层序遍历。原创 2023-11-30 17:54:46 · 465 阅读 · 0 评论 -
LeetCode [简单] 对称二叉树&二叉树的直径
如果左子树不为空,则最长路径的左端是左子树的最深叶结点,否则最长路径的左端是根结点;如果右子树不为空,则最长路径的右端是右子树的最深叶结点,否则最长路径的右端是根结点。因此,子树的最长路径长度为该子树的左子树和右子树的深度之和,子树的深度为该子树的左子树和右子树的深度的较大值加 1。空间复杂度:O(n),其中 n是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下是 O(n)。时间复杂度:O(n),其中 n 是二叉树的结点数。每个结点都被访问一次。原创 2023-11-30 13:08:17 · 103 阅读 · 0 评论 -
LeetCode [中等]和为 K 的子数组
给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。子数组是数组中元素的连续非空序列。思路:sum: 当前位置的累积和。如果以当前位置为结尾的数组中,存在和为k的子数组,那么,一定存在更短的子数组和为sum - k。使用一个循环遍历数组 nums。a. 在每次循环中,更新 sum 为当前位置的累积和,即 sum += nums[i]。b. 检查 counts 中是否存在 sum - k,如果存在,将对应的频次加到 ans中原创 2023-11-29 13:51:38 · 310 阅读 · 0 评论 -
LeetCode [中等]3. 无重复字符的最长子串
给定一个字符串s,请你找出其中不含有重复字符的的长度。原创 2023-11-28 10:12:59 · 239 阅读 · 0 评论 -
LeetCode [简单](非递归)二叉树的中序遍历
再次遍历左孩子,将他们放入栈中,如果没有左孩子了,就出栈,root变为栈顶元素,存值,向右走。遍历左孩子,将他们放进栈中,左边走到尽头,出栈,root变为栈顶元素,存值,向右边走一个。原创 2023-11-28 09:32:04 · 239 阅读 · 0 评论 -
LeetCode [简单]118. 杨辉三角
在「杨辉三角」中,每个数是它左上方和右上方的数的和。生成「杨辉三角」的前 numRows。给定一个非负整数 numRows。原创 2023-11-27 09:15:05 · 205 阅读 · 0 评论 -
LeetCode [简单] 70.爬楼梯
你有多少种不同的方法可以爬到楼顶呢?1. 1 阶 + 1 阶 + 1 阶。有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。原创 2023-11-27 08:45:17 · 276 阅读 · 0 评论 -
LeetCode [简单] 160. 相交链表
创建两个指针 pointer1 和 pointer2,两个指针分别依次遍历headA、headB,区别在于,pointer1从 headA 开始遍历,而 pointer2 从 headB 开始遍历。时间复杂度:O(m+n),其中 m 和 n 分别是链表 headA 和 headB 的结点数。最坏情况下,每个指针遍历两个链表各一次。,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。在此过程中,如果有相同的结构,必定会同时遍历到。,函数返回结果后,链表必须。空间复杂度:O(1)O。原创 2023-11-25 19:35:05 · 180 阅读 · 0 评论 -
LeetCode [中等]128. 最长连续序列
如果通过数组查找起始数字,对于 [4,3,3,3] 的包括重复元素的数组,筛选起始数字后,4不考虑,可是数组的3重复了3次,就会查询3次,但3这个元素其实只需要查询一次即可,所以需要去重,那么就可以利用哈希表的键值唯一特点,数组[4,3,3,3]建立的哈希表键值只有[4,3],筛选掉4之后,只剩下元素3,不会被元素重复浪费时间;哈希表中保存不重复的数字作为键,值为null,之后遍历键,如果有连续小于该键的,那么向后遍历到最小的那个键,之后保存长度。时间复杂度:O(n)空间复杂度:O(n)原创 2023-11-24 09:46:14 · 98 阅读 · 0 评论 -
LeetCode [中等] 49. 字母异位词分组
排序后的字符串作为字典的键,将排序后相同的字符串作为异味词放入字典中的同一个列表中。利用字符数组的排序,将字符串数组中的每个字符串转换为字符数组,进行排序;是由重新排列源单词的所有字母得到的一个新单词。可以按任意顺序返回结果列表。最终,返回所有这些列表组成的列表。给你一个字符串数组,请你将。原创 2023-11-22 10:11:08 · 111 阅读 · 0 评论 -
斐波那契数列 递归/非递归
【代码】斐波那契数列 递归/非递归。原创 2023-09-11 08:53:51 · 53 阅读 · 0 评论 -
BM4 合并两个排序的链表
【代码】BM4 合并两个排序的链表。原创 2023-09-09 09:46:41 · 54 阅读 · 0 评论 -
C# 常用排序算法 —— 插入排序:直接插入排序
思想:复制插入元素为哨兵,记录后移,查找插入位置。原创 2023-09-05 10:50:00 · 280 阅读 · 0 评论 -
C# 常用排序算法——选择排序:简单选择排序
n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换。原创 2023-09-05 10:47:18 · 117 阅读 · 0 评论 -
C# 常用排序算法——选择排序:归并排序
将2个或2个以上的有序子序列“归并”为一个有序序列,常用2-路归并排序。思想:基于分治,先递归再排序。原创 2023-09-05 10:29:24 · 93 阅读 · 0 评论 -
C# 常用排序算法——选择排序:堆排序
2.思想:输出堆顶极值,使剩余(n-1)个元素重新成堆,得到下次极值,反复,直到得到所有序列。1.可将一维数组视为一棵完全二叉树。原创 2023-09-05 10:14:47 · 60 阅读 · 0 评论 -
C# 常用排序算法——交换排序:快速排序
做法:取基准,小于基准的放左边,大于基准的放右边,从而酱待排序表划分为两个独立的部分,即为一趟快排。2.每趟排序基准元素都会放到最终位置上。1.内部排序中性能最优。原创 2023-09-05 09:54:14 · 163 阅读 · 0 评论 -
BM43 包含min函数的栈
【代码】BM43 包含min函数的栈。原创 2023-08-30 10:05:17 · 51 阅读 · 0 评论 -
BM44 有效括号序列
遇到右半部分判断与现在的栈顶是否匹配,不匹配/栈空,为false,反之,相匹配的栈顶就出栈;最后判断是否还剩下左边部分,即栈是否为空,为空,true,反之,false。遇到括号左半部分就进栈。原创 2023-08-30 09:49:50 · 67 阅读 · 0 评论 -
BM26 求二叉树的层序遍历
【代码】BM26 求二叉树的层序遍历。原创 2023-08-29 08:53:22 · 41 阅读 · 0 评论 -
BM23 递归算法—二叉树的前/中/后 序遍历
【代码】BM23 二叉树的前序遍历。原创 2023-08-26 15:10:59 · 96 阅读 · 0 评论 -
BM51 数组中出现次数超过一半的数字(摩尔投票算法)
当计数器count减到0时,表示当前候选元素的出现次数不足以超过数组长度的一半,需要重新选择一个新的候选元素,并将计数器count重置为1。2. 如果计数i减到0,说明当前选定的temp元素的出现次数不足以超过数组长度的一半,需要重新选择一个新的temp元素。1. 如果temp元素的出现次数超过了数组长度的一半,那么不同元素的数量一定比temp元素少,所以计数i最终一定会大于0;使用摩尔投票算法需要注意的是,输入的数组必须满足存在出现次数超过一半的主要元素,否则算法可能返回不正确的结果。原创 2023-08-26 11:26:50 · 54 阅读 · 0 评论 -
BM55 没有重复项数字的全排列
7. 最终结果 res 是一个二维整型数组,包含了 [1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]、[3,2,1] 六种排列方式。调用 permute(2,[1,2,3])。- 第二次循环,i 等于 2,调用 swap([1,2,3],1,2),得到 [1,3,2]。- 第二次循环,i 等于 2,调用 swap([2,1,3],1,2),得到 [2,3,1]。- 第二次循环,i 等于 2,调用 swap([3,2,1],1,2),得到 [3,1,2]。原创 2023-08-25 22:15:02 · 54 阅读 · 0 评论 -
BM96 主持人调度(二)
【代码】BM96 主持人调度(二)原创 2023-08-25 09:17:49 · 58 阅读 · 0 评论 -
BM98 螺旋矩阵
在这个实现中,我们使用四个变量来跟踪遍历的上下左右边界。首先,我们向右遍历上边界,然后向下遍历右边界,接着向左遍历下边界,最后向上遍历左边界。在每个方向上的遍历过程中,我们始终保持边界值的正确性。当上边界大于下边界或左边界大于右边界时,表示已经遍历完整个矩阵。这个实现的时间复杂度和空间复杂度都是 O(m * n),其中 m 是矩阵的行数,n 是矩阵的列数。时间复杂度是因为需要遍历整个矩阵,而空间复杂度是因为需要存储返回的结果。原创 2023-08-24 22:42:54 · 48 阅读 · 0 评论 -
BM13 判断一个链表是否为回文结构(快慢指针)
使用快慢指针来实现,slow来遍历前半部分,记录中间位置(链表长为奇数 则为正中间;偶数则为前半部分最末尾的数值),fast来记录链表最后一个奇数位置。找到中间位置之后 反转链表。原创 2023-08-24 22:10:08 · 40 阅读 · 0 评论 -
BM16 删除有序链表中重复的元素-II
需要一个虚拟头结点dummy,作为原链表的上一个结点(即dummy.next = head)一个指针用于遍历链表,另一个指针用于判断当前元素是否是重复元素。原创 2023-08-24 09:02:00 · 44 阅读 · 0 评论 -
BM17 二分查找-I
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1。找中点,然后根据 中间值的大小 来改变左界 或者 右界。请实现无重复数字的升序数组的二分查找。原创 2023-08-24 08:11:08 · 52 阅读 · 0 评论 -
BM50 两数之和
【代码】BM50 两数之和。原创 2023-08-23 22:16:10 · 38 阅读 · 0 评论 -
BM84 最长公共前缀
如果 strs[0]的长度大于后面一个字符串的长度 , 并且将str[0][i] 与 str[j][i] 的值相比,不符合,直接跳出循环。以传入的字符串列表第一个字符串长度为基准,即strs[0],不断向后判断后面的字符串的长度与值,即strs[1]以后的内容。新开一个 StringBuilder变量来动态保存相同的字符。传入的string类型的列表看成一个二维数组,一维是各。最后返回prefix.ToString()字符串。原创 2023-08-23 21:30:42 · 46 阅读 · 0 评论 -
BM83 字符串变形
使用一个栈 stack(存储每个单词) 和 一个StringBuilder类型的word(一个一个字母存储当前单词)字符串。1.将传入字符串以' ' 为分割存储,也就是每个单词存入栈中,每个字母存储的时候转换大小写,存储完之后从栈中取出。利用 栈(先进先出)的特点。原创 2023-08-23 17:19:34 · 45 阅读 · 0 评论 -
BM64 最小花费爬楼梯
每次都会将该次最小消耗存储至cost[0]中,并更新cost[1],其值为选择走一节或两节的最小值。cost1是当前楼梯的 上一次 行走两节楼梯的 花费,cost2是上一次行走一节 楼梯的花费。cost[1]是当前最小消耗,cost[0]是上一次最小消耗。cost[i]为到达第i阶楼梯的能量消耗。DP 需注意,从第二节楼梯开始查找,原创 2023-08-23 11:03:34 · 42 阅读 · 0 评论