LeetCode
文章平均质量分 80
Programmie
这个作者很懒,什么都没留下…
展开
-
LeetCode 432 全O(1)数据结构
今天捣鼓一天总算是把整个代码给搞通顺了。整体思路是双端链表+Hash的方式,实现代码为C++;首先定义双端链表结点的数据结构(与LRU那道题有点类似),我们规定,链表是一个升序链表:struct Node { Node() {} Node(string key) : key(std::move(key)), count(1) {} // 保存当前的key和count值,其中count默认赋值为1 string key; int count; No原创 2021-07-11 22:30:05 · 329 阅读 · 0 评论 -
递归学习与理解
最近重新开始做力扣的习题,加深了自己对于递归的理解,因此以两道题为例分别解释递归的作用。两道题分别是LeetCode 83和24。虽然它们都有相应的迭代解法,但是递归的解法相对更为巧妙。以LeetCode83为例:迭代方式ListNode deleteDuplicates(ListNode head) { ListNode dummy = head; while (head != null && head.next != null) { if (hea原创 2021-07-10 12:30:28 · 368 阅读 · 0 评论 -
LintCode 486:(快手面试真题)合并K个有序数组
当时没撕出来,下来看了一下,要用到最小堆来进行辅助。整体的算法复杂度是O(Nlogk),N是所有点的总数,logk是堆内调整的复杂度代码如下:public int[] mergekSortedArrays(int[][] arrays) { List<Integer> res = new ArrayList<>(); int high = arrays.length; Queue<int[]> queue = new PriorityQueu原创 2020-10-11 16:28:31 · 281 阅读 · 0 评论 -
动态规划:学习总结
动态规划1.题目特点(1)计数- 有多少种方式走到右下角- 有多少种方法选出k个数使得和是Sum(2)求最大最小值从左上角走到右下角路径的最大数字和最长上升子序列长度(3)求存在性取石子游戏,先手是否必胜能不能选出k个数使得和是sum例题: Coin Change动态规划解题步骤确定状态两个意识:最后一步 & 子问题(1)最后一步:得出的最后结果一定是最优结果。通过最优结果去反推前面的结果(2)子问题:通过最后的结果去反推前面的各个子问题(原创 2020-07-19 14:39:45 · 190 阅读 · 0 评论 -
字符串部分:子字符串查找
子字符串查找在母串中匹配对应的模式串(pattern)暴力查找public class PatternMatch { public static int search(String pat, String txt) { int M = pat.length(); int N = txt.length(); for (int i = 0; i <= N - M; i++) { int j; /原创 2020-07-10 23:22:04 · 395 阅读 · 0 评论 -
最短路径:学习总结
最短路径最小生成树是以无向带权图为基准,而最短路径则是以加权有向图为基准最短路径树给定一幅加权有向图和一个顶点s。以s为起点的一棵最短路径树是图的一幅子图,它包含s和从s可达的所有顶点。根节点为s,到叶子结点的每条路径和都是有向图中的一条最短路径基本数据结构:public class DirectedEdge { // 定义的是起始节点,互相不一定互通 private final int v; private final int w; private fin原创 2020-06-22 14:50:00 · 1619 阅读 · 0 评论 -
LeetCode刷题(二):树的递归部分
树 – 递归部分1.求树的高度 – :没什么难度,分别对左子树和右子树求高度,取两者的较大值。+1是为了囊括结点本身的高度public class MaxDepth_104 { public int maxDepth(TreeNode root) { if (root == null) return 0; // 分别递归求解左右子树的高度,注意最后需要加上结点本身的高度 return Math.max(maxDepth(root.left)原创 2020-06-16 23:05:54 · 270 阅读 · 0 评论 -
有向图:学习总结
有向图相较于无向图,有向图的边是带有方向性的。v→w,那么v的邻接点链表中会有w,但是w的邻接点链表不存在v。因此就邻接表来说,体现有向性是通过链表中的节点有无来实现的。public class Digraph { private final int V; private int E; // 边的有向性体现在结点添加时,不像之前无向图,两端结点可以互达。 // 有向图的节点是不一定可互达的 private Bag<Integer>[] adj;原创 2020-06-16 18:55:43 · 884 阅读 · 0 评论 -
无向图:学习整理
无向图使用的数据结构:邻接表:使用一个以顶点为索引的列表数组 – 每个元素都是和该顶点相邻的顶点列表空间和V+E成正比添加一条条边所需的时间为常数遍历顶点v的所有相邻顶点所需的时间和v的度数成正比基本数据结构:public class Graph { private final int V; private int E; private Bag<Integer>[] adj; //邻接表 public Graph(int V) {原创 2020-06-16 15:01:14 · 332 阅读 · 0 评论 -
红黑树:整理学习
红黑树红黑树定义红色结点均为左节点 – 红色结点与黑色结点合并会得到一个-3结点没有任何一个结点同时和两个红色结点相连任一空连接到根节点的长度和黑色结点的数目相同结点定义// 红色结点记为true,黑色记为falseprivate static final boolean RED = true;private static final boolean BLACK = false;// BST helper node data typeprivate class Node {原创 2020-06-15 20:32:34 · 134 阅读 · 0 评论 -
堆排序:学习记录
堆排序核心要点:通过下沉的方式,自底向上进行建堆 ,可以保证当检测到有父节点的堆有序时,其所有子堆都是满足堆的成立条件。即父节点大于任意两个子节点下沉排序的过程,实质上是在删除最大元素后,堆的自我调整过程。调整的过程中,堆逐渐构成一个有序序列父节点的坐标是左子节点的一半,所以开头要减一。由于使用了一个完全二叉树,因此索引为0的位置不能有数public static void heapSort(int[] arr) { int N = arr.length - 1; // 建堆原创 2020-06-14 21:53:38 · 137 阅读 · 0 评论 -
其他排序算法:学习整理
其他排序算法整理选择排序选一个最小的放在最前面,然后前面的就有序了,最简单的排序。public static void selectSort(int[] arr){ for (int i = 0; i < arr.length - 1; i++) { // 从当前i开始 int min = i; for (int j = i; j < arr.length; j++) { // 当有更小的记录 -- 选择最小的原创 2020-06-14 21:01:21 · 148 阅读 · 0 评论 -
归并排序:学习记录
归并排序要点:基于分治的思想,将需要比较的数组分为左右两部分。自顶向下进行分组,知道lo >= hi时,开始递归出栈。将出栈后的数组依次进行递归,借助一个辅助数组aux对数组结果临时储存归并操作从开头和中间两个位置向左遍历当左半部分已经到头,只须将右半部分辅助数组的数据赋值给原数组的对应位置右半部分到头同理当左半部分的值大于右半部分,则用右半部分的值进行赋值;右半部分同理这样保证归并后的数组,左半部分始终是较小值;而右半部分始终是较大值代码实现// 根据实际的数组安排原创 2020-06-14 19:50:23 · 139 阅读 · 0 评论 -
快速排序:学习记录
快速排序快速排序的基本思想是:选择一个排序的切分点,对剩余的部分进行从前至后的遍历从左边开始向右,找到第一个比切分点大的值从右边开始向左,找到第一个比切分点小的值交换两个值的位置这样保证切分点左边比切分点小,右边比切分点小同时交换的前提是两个指针不发生碰撞(相遇) — 假定了切分点是在中间这里将第一个位置作为切分点,因此还需要返回切分点的具体位置在碰撞发生后,切分循环退出,这时需要交换低位(low)与碰撞的h因为发生碰撞时,h是不大于l的,需要交换两个低位值,所以交换的是h和原创 2020-06-14 18:01:45 · 124 阅读 · 0 评论 -
力扣刷题记录(一):链表
双指针问题两个链条求交点,每一条链条到达尾端的时候,执行一次链条的切换,可以最终使两个链条达到同步运行的效果。这里注意到达尾部的条件是为null,而不是下一个结点为nullpublic ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode pointA = headA, pointB = headB; while (pointA != pointB) { // 到达尾部的时候才需要进原创 2020-06-11 23:36:09 · 235 阅读 · 0 评论