编程技术
文章平均质量分 77
编程技术
转战三千里
这个作者很懒,什么都没留下…
展开
-
哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。哈希表原理哈希表的关键思想是使用哈希函数将键映射到存储桶。更确切地说,..原创 2020-06-01 10:20:49 · 118 阅读 · 0 评论 -
数组
目录基本概念基本操作力扣题基本概念数组是用于储存多个相同类型数据的集合。基本操作int[] array=new int[len];//创建长度为len的一维数组Arrays.sort()//排序Arrays.copyof(array,x)//复制array数组的array[0]到array[x]力扣题56. 合并区间给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[.原创 2020-06-13 18:53:34 · 133 阅读 · 0 评论 -
树
目录基本概念特点基本操作java实现树基本概念树是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)n(n>0) 个有限节点组成一个具有层次关系的集合。把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 特点每个节点都只有有限个子节点或无子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节...原创 2020-06-07 08:48:01 · 100 阅读 · 0 评论 -
队列(10个常用数据结构之一)
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。...原创 2020-05-31 21:20:54 · 367 阅读 · 0 评论 -
链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。2. 两数相加给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来...原创 2020-05-31 10:20:15 · 260 阅读 · 0 评论 -
栈(十个常用数据结构之一)
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。20. 有效的括号给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号...原创 2020-06-06 14:10:50 · 329 阅读 · 0 评论 -
二分搜索算法
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。二分搜索的核心是每次搜索“丢弃”一半的数据模式识别:有序或者部分有序,基本使用二分搜索及其变种33. 搜索旋转排序数组假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。搜索一个给定的目标值,如果数组中存在这个目标值...原创 2020-06-05 20:36:13 · 632 阅读 · 1 评论 -
排序算法总结
选择排序首先,找到数组中最小的元素,将其与数组的第一个元素交换位置。然后再在剩余的元素中找最小的元素,与数组的第二个元素交换位置。如此往复,直到整个数组排序。public class Selection { public static void sort(int[] nums){ for(int i=0;i<nums.length;i++){ int min=i; for(int j=i;j<nums.leng原创 2021-03-18 08:32:43 · 249 阅读 · 2 评论 -
递归算法
递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。在递推阶段,必须要有终止递归的情况。206. 反转链表反转一个单链表。示例:...原创 2020-06-03 19:28:53 · 315 阅读 · 0 评论 -
回溯算法
目录基本概念力扣题基本概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。力扣题...原创 2020-06-16 09:25:33 · 145 阅读 · 0 评论 -
双指针算法
双指针是一种思想,一种技巧或一种方法,并不是什么特别具体的算法,在二分查找等算法中经常用到这个技巧。具体就是用两个变量动态存储两个或多个结点,来方便我们进行一些操作。通常用在线性的数据结构中,比如链表和数组,有时候也会用在图算法中。在我们遇到像数组,链表这类数据结构的算法题目的时候,应该要想得到双指针的套路来解决问题。11. 盛最多水的容器给你n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画n条垂直线,垂直线i的两个端点分别...原创 2020-06-05 15:40:23 · 179 阅读 · 0 评论 -
动态规划法
动态规划法利用问题的最优性原理,以自底向上的方式从子问题的最优解逐步构造出整个问题的最优解。动态规划法设计算法一般分成三个阶段:(1)分段:将原问题分解为若干个相互重叠的子问题;(2)分析:分析问题是否满足最优性原理,找出动态规划函数的递推式;(3)求解:利用递推式自底向上计算,实现动态规划过程。 5. 最长回文子串给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。示例 1:输入: "b...原创 2020-06-03 18:55:57 · 348 阅读 · 0 评论 -
5. Pattern: Cyclic Sort,循环排序
这种模式讲述的是一直很好玩的方法:可以用来处理数组中的数值限定在一定的区间的问题。这种模式一个个遍历数组中的元素,如果当前这个数它不在其应该在的位置的话,咱们就把它和它应该在的那个位置上的数交换一下。你可以尝试将该数放到其正确的位置上,但这复杂度就会是O(n^2)。这样的话,可能就不是最优解了。因此循环排序的优势就体现出来了。y该图的含义是第一步将下标为0的2拿出来,扫描数组发现有1个数字比它小,于是应该把他放在下标为1的地方,所以与元素6交换位置第二步将下标为1的2拿出来,发现在正确位置第原创 2021-03-29 15:46:46 · 216 阅读 · 0 评论 -
3. Pattern: Fast & Slow pointers, 快慢指针类型
目录力扣经典题141. 环形链表LinkedList Cycle (easy)142. 环形链表 IIStart of LinkedList Cycle(medium)202. 快乐数Happy Number (medium)876. 链表的中间结点Middle of the LinkedList (easy)这种模式,有一个非常出名的名字,叫龟兔赛跑。咱们肯定都知道龟兔赛跑啦。但还是再解释一下快慢指针:这种算法的两个指针的在数组上(或是链表上,序列上)的移动速度不一样。还别说,这种原创 2020-08-06 10:36:26 · 338 阅读 · 0 评论 -
7. Pattern: Tree Breadth First Search,树上的BFS
这种模式基于宽搜(Breadth First Search (BFS)),适用于需要遍历一颗树。借助于队列数据结构,从而能保证树的节点按照他们的层数打印出来。打印完当前层所有元素,才能执行到下一层。所有这种需要遍历树且需要一层一层遍历的问题,都能用这种模式高效解决。这种树上的BFS模式是通过把根节点加到队列中,然后不断遍历直到队列为空。每一次循环中,我们都会把队头结点拿出来(remove),然后对其进行必要的操作。在删除每个节点的同时,其孩子节点,都会被加到队列中。识别树上的BFS模式:如果你被原创 2021-04-23 10:30:23 · 264 阅读 · 0 评论 -
8. Pattern: Tree Depth First Search,树上的DFS
树形DFS基于深搜(Depth First Search (DFS))技术来实现树的遍历。咱们可以用递归(或是显示栈,如果你想用迭代方式的话)来记录遍历过程中访问过的父节点。该模式的运行方式是从根节点开始,如果该节点不是叶子节点,我们需要干三件事:需要区别我们是先处理根节点(pre-order,前序),处理孩子节点之间处理根节点(in-order,中序),还是处理完所有孩子再处理根节点(post-order,后序)。 递归处理当前节点的左右孩子。识别树形DFS:你需要按前中后序的DFS方原创 2021-04-27 15:03:05 · 141 阅读 · 0 评论 -
6. Pattern: In-place Reversal of a LinkedList,链表翻转
在众多问题中,题目可能需要你去翻转链表中某一段的节点。通常,要求都是你得原地翻转,就是重复使用这些已经建好的节点,而不使用额外的空间。这个时候,原地翻转模式就要发挥威力了。这种模式每次就翻转一个节点。一般需要用到多个变量,一个变量指向头结点(下图中的current),另外一个(previous)则指向咱们刚刚处理完的那个节点。在这种固定步长的方式下,你需要先将当前节点(current)指向前一个节点(previous),再移动到下一个。同时,你需要将previous总是更新到你刚刚新鲜处理完的节点...原创 2021-03-29 16:07:46 · 214 阅读 · 0 评论 -
2. Pattern: two points, 双指针类型
双指针是这样的模式:两个指针朝着左右方向移动(双指针分为同向双指针和异向双指针),直到他们有一个或是两个都满足某种条件。双指针通常用在排好序的数组或是链表中寻找对子。比如,你需要去比较数组中每个元素和其他元素的关系时,你就需要用到双指针了。我们需要双指针的原因是:如果你只用一个指针的话,你得来回跑才能在数组中找到你需要的答案。这一个指针来来回回的过程就很耗时和浪费空间了+—+这是考虑算法的复杂度分析的时候的重要概念。虽然brute+force一个指针的解法可能会奏效,但时间复杂度一般会是O(n²)。在很原创 2020-08-05 15:55:13 · 466 阅读 · 0 评论 -
1. Pattern: Sliding window,滑动窗口类型
目录力扣经典题325. 和等于 k 的最长子数组长度Maximum Sum Subarray of Size K (easy)Smallest Subarray with a given sum (easy)340. 至多包含 K 个不同字符的最长子串Longest Substring with K Distinct Characters (medium)904. 水果成篮Fruits into Baskets (medium)1100. 长度为 K 的无重复字符子串No-repea原创 2020-08-01 10:41:26 · 440 阅读 · 0 评论 -
4. Pattern: Merge Intervals,区间合并类型
区间合并模式是一个用来处理有区间重叠的很高效的技术。在设计到区间的很多问题中,通常咱们需要要么判断是否有重叠,要么合并区间,如果他们重叠的话。这个模式是这么起作用的:假设第一个区间的起始位置小于第二个区间的起始位置,有6种不同的情况理解和识别这六种情况,非常重要。因为这能帮你解决一大堆问题。这些问题从插入区间到优化区间合并都有。判断合并区间模式当你需要产生一堆相互之间没有交集的区间的时候 当你听到重叠区间的时候力扣经典题56. 合并区间Merge Intervals (mediu原创 2020-08-11 16:07:41 · 147 阅读 · 0 评论 -
9. Pattern: Two Heaps,双堆类型
很多问题中,我们被告知,我们拿到一大把可以分成两队的数字。为了解决这个问题,我们感兴趣的是,怎么把数字分成两半?使得:小的数字都放在一起,大的放在另外一半。双堆模式就能高效解决此类问题。正如名字所示,该模式用到了两个堆,是不是很难猜?一个最小堆用来找最小元素;一个最大堆,拿到最大元素。这种模式将一半的元素放在最大堆中,这样你可以从这一堆中秒找到最大元素。同理,把剩下一半丢到最小堆中,O(1)时间找到他们中的最小元素。通过这样的方式,这一大堆元素的中位数就可以从两个堆的堆顶拿到数字,从而计算出来。判断原创 2021-04-27 21:06:48 · 307 阅读 · 0 评论