C#数据结构
一棵橙子树
C#/C++
展开
-
算法解析之滑动窗口——解决子数组、子串问题
滑动窗口本质上是一种非常好理解的算法,用一道例题来展示:如何在一个字符串中找到包含另一个字符串的最短子字符串?这个题目看着有点绕,是leetcode一道Hard题。下面来写一下滑动窗口框架:public string MinWindow(string s,string t) { Dictionary<char, int> ne...原创 2020-04-29 15:18:14 · 496 阅读 · 0 评论 -
广度优先搜索算法框架(Breadth-First-Search)
一、算法框架int BFS(Node start, Node target){ Queue<Node> q = new Queue<Node>(); HashSet<Node> visited = new HashSet<Node>(); q.Enqueue(start); visited.Add(start)...原创 2020-04-23 12:18:28 · 448 阅读 · 0 评论 -
进程、线程与协程三者的区别与联系
1.什么是进程、线程和协程进程是系统进行资源分配和调用的基本单位,每一个进程都有它自己的内存空间和系统资源。线程是进程的执行单元或者执行路线,线程也是CPU调度的基本单位。协程是用户态的轻量级线程,在理解用户态的线程之前,必须先了解什么是内核态线程,内核态线程是由操作系统负责调度的线程,利用时间片轮转的方式进行调度的,而用户态线程是由程序员调度的,操作系统对此一无所知,协程拥有自己的...原创 2019-11-15 09:27:17 · 400 阅读 · 0 评论 -
C#编译执行过程以及.net内存管理和垃圾回收
一、C#编译执行的过程我们要和外国人交流,又不懂它们的语言,我们怎么办,无非就是先说出我们的语言,然后翻译出来,再给外国人听,这于代码的编写执行过程是一致的。下面简单介绍下C#代码的执行过程,并同时介绍IL、CLR、JIT等内容。1.第一步是在类似visual studio2017这样的编译器上,按照规则写出C#代码,类似我们在说我们的母语。2.第二步是编译器进行编译,产生dll或者e...原创 2019-11-14 13:43:57 · 254 阅读 · 0 评论 -
二叉树重构:由前序遍历和中序遍历重构二叉树
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApp1{ class Program { static void Main(string[] ...原创 2019-11-13 13:16:54 · 218 阅读 · 0 评论 -
找出数组中缺失的元素
方法一:排序然后遍历,时间复杂度最好的就是o(NlogN)不够简洁方法二:异或运算 将缺失值补为0,那么由于数组值是0~n,而数组下标也是0~n,那么在异或运算后即可得到缺失值的下标也就是该缺失值。方法三:等差数列求和并相减,就可以得到缺失值,但是要注意溢出问题。 class Solution { //异或运算求解 public int ...原创 2019-11-13 10:33:49 · 3547 阅读 · 1 评论 -
leetcode:一行代码就能解决的智力题
看了这些题,总觉得自己智商不够了······第一题:注意,你们双方都是很聪明的,意思是这里会互相博弈,当然可以用BP但是就很复杂了。思考一下,如果你要赢,你最后要拿1~3颗石头,那么你就要给对手去拿4颗石头,如果要给对手拿4颗石头,那么要给你拿5~7颗石头,于是就要给对手拿8颗石头~恍然大悟: class Solution { private ...原创 2019-11-13 10:00:13 · 278 阅读 · 0 评论 -
深度优先遍历解决括号生成问题
namespace ConsoleApp10{ class Program { static void Main(string[] args) { Solution solution = new Solution(); solution.generateParenthesis(3); ...原创 2019-11-13 09:31:45 · 197 阅读 · 0 评论 -
求数组中两数之和为指定数的两数序列下标
给定一个已经升序排列的有序数组,找到两个数使得它们相加之和等于目标数。数组的很多问题,都可以通过双指针来解决,例如前几篇文章的在数组中找和最大的连续元素,数组去重等问题。很多求和再比较的问题往往可以借助于双指针。使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。 如果sum > targe...原创 2019-10-31 20:10:48 · 651 阅读 · 0 评论 -
对于一个整数数组,如何求具有最大和的连续子数组
题目描述:给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其和最大。示例:输入:[-2,1,-3,4,-1,2,1,-5,4],输出:6,解释:连续子数组[4,-1,2,1]的和最大为6.分析:乍一看这个题目还挺绕的,和最大的连续子数组,其实仔细分析一下,假如数组为某n个连续数组,如果前n-1个的和为负数,那么我们肯定不会要了,直接会从第n个...原创 2019-10-30 21:40:54 · 2631 阅读 · 3 评论 -
数组和链表的优雅去重——时间复杂度O(n)且不使用额外空间
看题: 注意:不仅要输出长度,而且要给数组排序,不可有重复。由于数组中元素已经有序,那么重复元素一定在一起,找出他们不难,我们会在外层循环中先找打它,然后用delete方法,删除这个元素,但是从数组中删除元素的时间复杂度为O(n),因为两层循环嵌套,时间复杂度就为O(n^2).这是因为数组在中间删除元素的时间复杂度为O(n),而在数组尾部删除的时间复杂度为O(1...原创 2019-10-29 18:58:39 · 1961 阅读 · 0 评论 -
C#图与图的算法之广度优先遍历
上篇文章介绍了深度优先遍历,同时也介绍了广度优先遍历的思想,这里直接上代码:using System;using System.Collections.Generic;using static System.Console;namespace 图的广度优先遍历{ class Node { public int item; public...原创 2019-10-27 20:29:22 · 685 阅读 · 0 评论 -
C#图与图的算法之深度优先遍历
关于图与图的算法,应该这样去学习:1.应该从图的概念讲起,例如无向图和有向图等,明白图是什么,能够表示哪些实际问题。2.学习图应该用怎样的数据结构去表示,这里就会学到邻接矩阵法和邻接链表法等数据结构,比较两种数据结构的优劣,在后面的算法学习中会用到。3.学习图的基础算法:基础的同样是最重要的,包括:深度优先遍历,广度优先遍历和拓扑排序等。4.学习图的一些高级算法(后面会陆续介绍)。...原创 2019-10-26 22:16:05 · 1259 阅读 · 0 评论 -
异或运算——快速寻找一个数组中仅出现一次的元素
异或 ^ ,进行二进制位运算,相同则返回0,不同则返回1。如果快速寻找一个数组中仅出现过一次的元素,例如输入{2,2,1},返回1,输入{1,2,3,4,5,6,5,3,4,2,1},返回6。要求时间复杂度为O(n)而且不能使用额外空间。利用异或位运算的性质:A^0 = A , A^A = 0,因而只需要对所有元素进行一次异或运算即可。代码如下:using System;na...原创 2019-10-24 15:54:49 · 548 阅读 · 0 评论 -
C#实现跳跃表
暂时没有时间研究,先保留记录下大佬的源码,有兴趣同学可以参考。https://github.com/kencausey/SkipList转载 2019-10-24 10:28:48 · 565 阅读 · 0 评论 -
C#红黑树实现代码
在学习红黑树之前,最好已经学习过AVL树了,因为二者的实现方式是有很大程度类似的(左旋和右旋),但是只不过二叉平衡树是在每次加入节点时,需要计算该节点的左右子树高度差,如果高度差大于一则旋转调节使其平衡;而红黑树是在每次加入节点时计算红黑节点之间的关系,如果关系错误,则通过旋转和改变颜色来调节树的结构。总之,AVL树也好,RB树也好,都只不过是一种优化二叉查找树的高级方式而已。下面是C#实...原创 2019-10-23 21:25:49 · 1446 阅读 · 2 评论 -
C#高级查找算法之平衡二叉树
关于平衡二叉树的传说听多了,“某某大厂笔试手撕平衡二叉树实现代码······”等,好像这是一个非常高深的难题似的,现在学习数据结构的时候遇到了,认真拿来看了看,发现不过如此。任何一个算法,理清楚它为什么这么做,然后根据代码看看它是怎么做到的,那也就不难了。关于平衡二叉树的讲解网上非常多,各位大佬讲解鞭辟入里,这里推荐一个:https://blog.csdn.net/u014165620/art...原创 2019-10-22 22:25:36 · 656 阅读 · 0 评论 -
C#排序算法汇总(基础和高级)
排序是日常生活中非常普遍的问题,我们每个人都有自己固定的思维模式,而往往这些固定的思维模式都是效率非常低算法,比如选择排序,插入排序和冒泡排序,使我们很容易想到的排序方法(其实我觉得冒泡可能都不会想到)所以学习别人的高级算法非常有必要,然而真正理解并不是看的懂就行了,也不是写一次代码跑成功就行了,我们需要熟练了知道它算法具体实现的程序中,每一步是在做什么,然后这个算法的时间复杂度、空间复杂度是...原创 2019-10-21 12:53:30 · 942 阅读 · 1 评论 -
C#二叉树学习总结2:标准的二叉查找树以及相关操作
上次对BinarySearchTree的总结不太常用,因为很多时候题目以及要求TreeNode的格式了,不能有parent节点,而且parent节点也会浪费一个空间,因而这里重新再写一遍更加标准的BST结构及其相应的操作。 class Node { //一个标准的Node public int val; public Node l...原创 2019-10-16 20:13:42 · 133 阅读 · 0 评论 -
C#内置链表
关于线性存储的结构,大家常提到的就是数组,然而数组虽然索引快,但是其中的插入删除操作依然比较复杂,尤其是对有序数组的操作,因而还有另一种结构,那就是链表。关于链表的构造,大家都应该比较清楚了,我们可以使用数组去模拟链表,叫做静态链表,我们也可以用C中的结构和指针来实现链表,也可以用C++/C#中类的结构来实现一个动态链表。在C#中,我们常提到的ArrayList就是基于链表实现的(每一个节点存...原创 2019-10-16 15:11:33 · 927 阅读 · 0 评论 -
C#基础散列表和HashTable类
散列表又叫哈希表,参考了众多博文,一个通俗易懂的解释就是:一个数据类型M,如果它有个函数f(key),对任意一个输入的key通过该函数都能转化为一个地址,存储在M中,那么M就是一个哈希表,这个函数就叫哈希函数。再说说为什么需要哈希函数,我们都知道在数据最重要的就是增删改查,然而数组这种数据结构改查快,但是增删慢(因为要移位),另一种数据结构链表,它增删快,但是改查慢,那么有没有更好的方法?哈希...原创 2019-10-15 14:01:21 · 350 阅读 · 0 评论 -
C#算法收集之如何高效的求素数
在一个公众号中看到,觉得确实巧妙,于是在这里记录分享。素数也叫质数,只有1和它自身两个约数,也就是说不能被2~n-1的数整除,那么如何求100以内的所有素数?看到这里你可能会觉得这个问题并不难,反手就扔过来你的算法:class Program { static void Main(string[] args) { GetPr...原创 2019-10-15 10:23:54 · 1195 阅读 · 0 评论 -
C#基础正则表达式
先简单总结下C#的字符串。C#字符串天生就有精神分裂(书中原话),既像值类型又是引用类型,更准确的说是可以像值类型一样去使用它,但是它是引用类型,是string类。C#string类提供了丰富的属性方法可以进行使用,除了我们都知道的Remove、Insert、count、Indexof、Replace、Split、Join(string类的静态方法)等,还有字符串大小比较的Equals、Compa...原创 2019-10-14 21:04:44 · 124 阅读 · 0 评论 -
C#堆栈和队列总结
C#中的System.Collection类中包含栈和队列的数据结构,当然自己实现一个类也完全可以,这里主要介绍C#中的栈和队列。一、栈(FILO)F12看Stack的定义。箭头所指的方法一般是我们常用的,可以看到这些方法都是虚方法,说明我们可以创建自己的特殊栈类,继承该类然后对这些方法进行改写。注意这里的ToArray()方法,是将该栈的一个副本保存到一个数组中,需要一个object...原创 2019-10-14 12:46:38 · 936 阅读 · 0 评论 -
C#基础查找算法总结:顺序查找,优化顺序查找,二叉查找(递归和非递归)
一、顺序查找:顾名思义,就是从头开始一直找到结束,找到了就返回,否则继续找,找完了没找到就返回-1 static int SequenceFind(int[] arr,int value) { for (int i = 0; i < arr.Length-1; i++) { i...原创 2019-10-12 20:30:37 · 466 阅读 · 0 评论 -
C#基础排序算法总结:冒泡法、选择排序法、插入排序法精炼总结
以下示例都是从小到大进行排序。一、冒泡法排序过程:从第一个数据开始,比较该数据和右边的数据的大小,如果比右边数据大,就进行交换,依次进行直到最后。对于每一次内层循环结束后的结果:都会在当前排序序列的最后一位产生一个最大的数。 public static void BubbleSort(int [] arr) { for (in...原创 2019-10-12 15:12:29 · 284 阅读 · 2 评论 -
C#二叉树学习总结1:二叉树的前、中、后、层序遍历以及二叉查找树的增删改查算法
为了简化二叉查找树的删除操作,我将节点按如下定义: class Node { public int data; public Node rChild; public Node lChild; //增加父节点,目的是为了便于删出节点的操作 public Node parent; public...原创 2019-10-11 10:34:46 · 501 阅读 · 0 评论