![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
mrbm_lj
这个作者很懒,什么都没留下…
展开
-
Leetcode 6. Z 字形变换
其实根据题目的意思, 换成 N 字形更为贴切. 按照给定的行数来, 比如行数为 4, 那么对应到给的图中, 每个字符所在的行号为0 1 2 3 2 1 0 ...0 1 2 3 2 1 0 就一直保持这个规律继续下去. 这个思路我是想出来, 但是并没有想好如何模拟出这个变化的过程. 然后看了一下大佬的题解, 学习一下 : 分析一下这个过程, 当到达 0 这个最小值, 后面就变成加 1, 当...原创 2020-03-27 16:05:38 · 103 阅读 · 0 评论 -
Leetcode 之二分法总结
二分法是查找问题中的常用方法, 也是一个写得差不多很容易, 写得正确不那么容易的问题. 下面针对在刷二分法中的一些问题进行小结, 本文章参考了如下的资料 :用“排除法”写二分问题, 以及二分查找算法细节详解. 感谢这两位同学的分享, 受益良多.首先二分法通常使用的前提是 目标数组是有序的.二分法基本模版在学习数据结构的查找算法时, 一定会给出如下的二分法基本模版 :c...原创 2020-02-24 16:30:43 · 620 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历, 分为层次遍历, 前序遍历, 中序遍历, 后序遍历. 是二叉树中的基本操作, 前序、中序、后序遍历一般也分为递归实现与非递归实现. 本文来将这三种遍历都实现一遍.下面这些代码都是在 leetcode 上通过的代码三种遍历的递归实现基本上就是按照遍历时, 左子树、父结点、右子树的遍历顺序来处理这三句代码的位置关系.前序遍历class Solution { ...原创 2020-01-09 19:52:15 · 55 阅读 · 0 评论 -
Leetcode 589. N-ary Tree Preorder Traversal
本题也是树的遍历, 只不过把二叉树换成了 N 叉树, 其实背后的思想还是一样的. 也用递归和非递归来实现一下 :我的思路递归思路class Solution { private List<Integer> result = new LinkedList<>(); public List<Integer> preorder(Node...原创 2020-01-08 12:57:53 · 113 阅读 · 0 评论 -
Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
题目大意 : 给定一个排序二叉树, 以及二叉树中的两个结点, 寻找两个结点的祖先结点中, 层数最深的结点.我的思路首先第一步是寻找两个给定结点的相同的祖先结点, 然后再选择层次最深的. 可以用一个函数, 判断给定的两个结点是否相连, 然后就利用二叉树基本的层次遍历, 这样遍历到的最后一个祖先结点就肯定是层次最深的了. 代码如下 :class Solution { public...原创 2020-01-07 15:09:22 · 67 阅读 · 0 评论 -
Leetcode 124. Binary Tree Maximum Path Sum
本题的思路其实和Longest Univalue Path这题的内容是一致的, 如果最长相同数值路径的逻辑能明白, 这里就是把数值相等的判断, 换成了数值加和的判断递归思路二叉树的路径问题常用递归来解决, 这里递归函数求的是以当前结点为起始的链路的最大值, 这里可能存在三种情况 :以当前结点为起始的左子树链路为最大值 以当前结点为起始的右子树链路为最大值 不包含左右子树, 当...原创 2020-01-05 10:44:50 · 62 阅读 · 0 评论 -
Leetcode 111. Minimum Depth of Binary Tree
本题是找到二叉树的最小深度, 即找到从一个叶子结点到根结点的最小路径.思路一 : 递归思路class Solution { public int minDepth(TreeNode root) { if (root == null) return 0; int left = minDepth(root.left); ...原创 2020-01-04 14:30:33 · 60 阅读 · 0 评论 -
Leetcode 101.Symmetric Tree
树的很多题目都是对根结点(或者当前结点) 进行处理之后, 再对子结点进行处理. 本题也是如此, 对根结点判断后, 再对其根节点的子结点进行判断处理. 同样也是有递归和非递归两种方式来解决.递归的方法 :class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) ...原创 2020-01-02 15:22:52 · 98 阅读 · 0 评论 -
Leetcode 387. First Unique Character in a String
我的思路用一个 HashMap 来记录该字符串中不同字符出现的个数, 然后遍历字符串, 查找当前字符的出现次数, 如果为 1, 直接返回该字符下标.class Solution { public int firstUniqChar(String s) { HashMap<Character, Integer> map = new HashMap<...原创 2019-12-16 14:24:31 · 72 阅读 · 0 评论 -
Leetcode 347. Sort Colors
本题就是荷兰国旗问题, 思路较为简单, 和快排的思路较为类似, 在数组的左边区间放 0, 初始区间的位置为 -1; 数组的右边区间放 2, 初始区间的位置为 nums.length; 然后遍历该数组, 如果该数为 0, 那么就和左边区间的下一个元素位置交换, 如果为 2, 那么就和右边区间的上一个元素位置交换. 但是要注意的是, 左边的元素已经遍历过了, 所以交换了之后也可以直接跳过该位置; 但是...原创 2019-12-16 13:28:03 · 58 阅读 · 0 评论 -
Leetcode 215.Kth Largest Element in an Array
通常遇到第 K 个大的元素这样的问题, 考虑排序类的问题.本题的题目就是问在这个数组中第 K 大的元素方法一最简单直接的做法当然是将该数组排序.这种方法的时间复杂度为 O(NlogN), 空间复杂度为 O(1)class Solution { public int findKthLargest(int[] nums, int k) { Arrays.s...原创 2019-12-16 12:43:17 · 82 阅读 · 0 评论 -
Leetcode 155. Min Stack
easy 难度的题目, 运用一个辅助栈来存储当前最小的元素, 思路简单 :class MinStack { private Stack<Integer> dataStack; private Stack<Integer> minStack; int minValue; /** initialize your data structure...原创 2019-12-01 16:47:26 · 64 阅读 · 0 评论 -
Leetcode 739. Daily Temperature
我的思路尽管本题是在栈的目录下, 但是并没有想到什么栈的思路, 所以就先使用最直接的暴力法来解决 : 两个 for 循环, 找到比当前数值大的就立即跳出里层的循环 :class Solution { public int[] dailyTemperatures(int[] T) { int length = T.length; int[] ans ...原创 2019-11-27 21:21:50 · 43 阅读 · 0 评论 -
Leetcode 20.Valid Parenthese
我的思路很简单, 遇到 ()、[]、{} 这三对符号的左边的就入栈, 遇到右边的就直接将栈顶元素与其对应进行比较, 能组成一对符号就出栈, 否则就返回 false. 因为有 6 种情况就使用 switch 语句 :import java.util.Stack;class Solution { public boolean isValid(String s) { ...原创 2019-11-27 15:19:55 · 69 阅读 · 0 评论 -
Leetcode 725. Split Linked List in Parts
本题自己想的时候, 连每条链表的结点个数都不明白, 这个其实就是这题的思路并没有那么难 : 首先通过给定的 K 可以确定链表的数量, 然后通过除法和取余操作可以确定每条链表的长度, 因为有余数肯定是每条链表平分的话分不到一个结点, 所以从第一个结点开始, 每个结点分一个即可, 分完余数就没有了.class Solution { public ListNode[] splitListT...原创 2019-11-24 09:20:43 · 73 阅读 · 0 评论 -
Leetcode 234. Palindrome Linked List
我的思路 :回文链表的判断, 我的第一思路就是将其反转后再和原链表进行比较, 然后自然就想到了利用栈来实现, 但是我的这个思路满足了 O(n) 的时间复杂度但是没有满足 O(1) 的空间复杂度, 我就先实现了一下 :import java.util.Stack;class Solution { public boolean isPalindrome(ListNode he...原创 2019-11-23 11:58:54 · 44 阅读 · 0 评论 -
Leetcode 445. Add Two Numbers II
本题就是实现两个链表表示的数的加法, 之前考虑的是将链表表示的值都取出来, 然后想加之后再用链表表示出来, 但是感觉这并不是这题考察的本意. 比较麻烦的地方是从链表尾的数字开始相加而不是从链表头.(同时这也是重要特征)并没有想到啥思路, 就准备看一下大神的思路, 看到了代码中的栈, 联想到之前的麻烦之处, 栈不就是先进后出, 完美满足了要求.我的思路其实也很直接, 将两个链表放到栈中...原创 2019-11-20 13:11:33 · 101 阅读 · 0 评论 -
Leetcode 206. Reverse Linked List
尽管是 easy 难度, 但是对于头插法的过程并没有很熟悉, 所以只能学习一下大神们的思路 :头插法 :建立带头结点的链表:class Solution { public ListNode reverseList(ListNode head) { ListNode newHead = new ListNode(-1); while(head ...原创 2019-11-19 20:55:08 · 136 阅读 · 1 评论 -
Leetcode 19. Remove Nth Node From End of List
我的思路和查找链表中倒数第 n 个结点的思路相似, 我们可以让一个指针 first 指向第 n-1 个 元素, 然后用一个指针 prev 指向链表头, 这样同时遍历, 当 first 指向最后一个结点的时候, prev 指向了倒数第 n 个结点 target 的上一个结点, 那么这个时候就对 target 进行判断, 如果 target 的后续结点不为空, 那么直接将 prev 的后续结点赋...原创 2019-11-18 23:44:38 · 59 阅读 · 0 评论 -
Leetcode 83 Remove Duplicates from Sorted List
我的解法 :easy 难度的题目, 上来思路也比较简单, 开一个新的哨兵结点, 然后依次遍历给定链表, 如果链表当前结点的值与新链表的当前结点的值不同, 就将其加入到新链表中, 否则就直接跳过. 下面是代码 :class Solution { public ListNode deleteDuplicates(ListNode head) { ListNode l ...原创 2019-11-18 13:13:49 · 76 阅读 · 0 评论 -
Leetcode 21.Merge Two Sorted Lists
本题思路很简单, 依次比较链表指针目前指向的结点的值, 将较小的值放到新链表中, 同时将链表指针更新, 直到其中一个链表为空, 那么接下来的就直接是另一个非空链表了./** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ...原创 2019-11-17 21:59:36 · 58 阅读 · 0 评论 -
Leetcode 565. Array Nesting
题意 :用 nums[i] 的值作为下标, 下一个值为第 nums[i] 的值. 这样不断嵌套, 直到遍历到遍历过的值, 所以也是求数组中存在的环的最大值.这里需要注意的是, 只要是存在一个环, 无论从哪里进入都是一样的, 所以按顺序遍历, 每个环都找一遍即可; 对于访问过的元素, 直接跳过即可, 因为不会出现两个环部分重合的情况. 这两点是需要想明白的.class Solution...原创 2019-10-25 11:43:16 · 61 阅读 · 0 评论 -
Leetcode 769. Max Chunks To Make Sorted
题目意思 :给一个长度为 n 的数组, 其元素的值也是从 0 ~ n - 1 的一个排列, 我们将这个数组分为若干部分, 将这些部分独自地排序, 然后将这些部分连接起来, 这个结果和将原数组直接排序的结果相同.没找到这背后的规律, 查看了一下其他大神的思路 : 这个算法就是找到一些分割线, 在这条线的左边的数字都小于这条线右边的数字.这个数组排序好的结果就是每个元素和下标的值相等. 所以...原创 2019-10-25 11:33:34 · 74 阅读 · 0 评论 -
普林斯顿算法课 Quick-Union Improvement
Weighted quick-union记录每个树的大小, 在连接的时候将小的树的根连接到大的树的根 上, 这样可以避免树的深度过大.public class WeightedQuickUnionUF { private int[] id; private int[] size; public WeightedQuickUnionUF(int N) { ...原创 2019-10-24 16:03:16 · 140 阅读 · 0 评论 -
普林斯顿算法课 dynamic connectivity problem
好好地做笔记, 将算法和数据结构这部分啃下来.Dynamic connectivity给定 N 个点, 通过连接命令将其中的几对点连接起来, 然后查询给出的两个点之间是否有连通的路径.union(a, b) : 将 a 和 b 连接起来connected(a, b) : a 和 b 之间是否有连通的路径Modeling the connections假设“连通” 是具有一...原创 2019-10-24 13:58:55 · 347 阅读 · 0 评论 -
Leetcode 448. Find All Numbers Disappeared in an Array Leetcode 442. Find All Duplicates in an Array
448 思路题目提出要求 : 不能使用额外的空间以及 O(n) 的时间复杂度.做了几题数组相关的题目, 都是数组的下标和数组的值之间存在关系的, 本题也是, 数组的值是从 1 ~ n, 应该联想到数组的值都减 1 的话, 刚刚好就是数组的下标了.所以先对数组进行一次遍历, 将数组元素进行标记 : nums[ nums[i] - 1] 标记为 -nums[ nums[i] - 1], ...原创 2019-10-20 15:36:01 · 71 阅读 · 0 评论 -
Leetcode 287. Find the Duplicate Number
接上面的那篇Linked List Cycle 的文章, 本题中也用到了 “环检测”问题.环检测问题该问题的一般形式如下 : 给定一个函数 f , 序列 x_i 的定义为 :x_0 = kx_1 = f(x_0)x_2 = f(x_1)x_3 = f(x_2)...x_{n + 1} = f(x_n)假设函数f从定义域映射到它本身,此时会...原创 2019-10-20 10:58:59 · 67 阅读 · 0 评论 -
Leetcode 141. 和 142.
最开始的时候是解决 378.Kth Smallest Element in a Sorted Matrix 的问题, 当然是学习大神的做法, 然后在说明中提到了一系列的题目, 就都记录一下.141. Linked List Cycle判断一个链表是不是循环链表./** * Definition for singly-linked list. * class ListNode {...原创 2019-10-15 22:56:33 · 157 阅读 · 0 评论 -
剑指offer系列之字符串的排列
牛客网剑指offer系列中的字符串的排列问题, 在刷算法题中, 递归问题是难度比较大的, 这也是面试中常问的原因, 在难度大的地方才有区分度. 将大神的代码贴过来, 便于复习和回顾.递归思路当不太能理解递归的整个流程的时候, 可以用 IDE 将程序进行调试, 一步步跟着程序来看执行情况, 对于递归的流程会有一个了解.本题的大致思路是将第一个字符和后面所有的字符交换, 然后固定第一个字...原创 2019-08-14 10:32:22 · 115 阅读 · 0 评论 -
剑指offer之二叉搜索树的后序遍历序列
数据结构中的数也是一个重难点. 本题考察二叉搜索树, 首先看二叉搜索树的定义 : 二叉搜索树(Binary Search Tree), 指的是一颗空树或者具有下列性质的二叉树 :若任意节点的左子树不为空, 则左子树上所有的节点的值均小于它的根节点的值; 若任意节点的右子树不为空, 则右子树上所有的节点的值均大于它的根节点的值; 任意节点的左、右子树也分别为二叉查找树; 没有键值相等的节点...原创 2019-08-14 16:43:10 · 62 阅读 · 0 评论 -
剑指offer之复杂链表的复制
牛客网剑指 offer 在线编程中的复杂链表的复制 :输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空.三步法 :三步法的步骤就是 : 先遍历链表, 在每个节点的后面, 复制原有节点, 比如复制节点 A 得到 A1, 将节...原创 2019-08-20 12:09:32 · 66 阅读 · 0 评论 -
剑指offer之数组中出现次数超过一半的数字
牛客网剑指offer在线编程系列, 本题的思路很多, 也比较简单, 记录一下.用 HashMap 实现遍历数组的时候, 用 HashMap 记录每个元素出现的次数, 重复的就加一.import java.util.HashMap;public class Solution { public int MoreThanHalfNum_Solution(int [] array...原创 2019-08-23 14:48:20 · 56 阅读 · 0 评论 -
剑指offer之连续子数组的最大和
本题相关链接, 连续子数组的最大和, 这个题目的思路较为简单, 直接上代码:public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length == 0 || array == null) return 0; in...原创 2019-09-07 10:34:16 · 45 阅读 · 0 评论 -
剑指offer之把数组排成最小的数
本题也是剑指offer系列中的试题.本来原来的思路是之前的全排列, 将所有的可能进行排列, 然后在结果中选出最小的. 但是这样的话, 必须将所有的情况都列出来, 不能中间进行判断, 那么复杂度就很高了.只能分享大神的思路了 : 将数组保存在一个 list 中, 然后用 Collections.sort 对其进行排序, 使用自己定义的排序器即可. 对于排序方法的重写也十分巧妙.impo...原创 2019-09-20 09:52:35 · 86 阅读 · 0 评论 -
Leetcode 27. Remove Element
最近在重新学习一下数据结构与算法的知识点, 只有将知识运用起来才能更好地掌握知识, 所以在学习了有关数组的知识之后, 在 LeetCode 上选择 tag 为 Array 的相关题目来学习一下, 在这里记录一下.本题为 easy 难度的 Remove Element : 题目意思很容易理解, 就是在不分配额外内存的情况下, 将数组中非选定的元素放到数组的前面, 返回数组中非选定元素的长度, 返...原创 2019-10-10 08:47:50 · 62 阅读 · 0 评论 -
Leetcode 53.Maximum Subarray
本题较为简单, 提供两个思路思路一 : 系统化的思路, 最初的结果肯定是第一个元素 A[0], 假设我们解决了 A[1, .. , i - 1] 的问题, 如何扩展到 A[1, .. , i] 呢 ?就是当前最大值与A[i] 的和、A[i] 两者间的较大值.class Solution { public int maxSubArray(int[] nums) { ...原创 2019-10-10 09:18:30 · 74 阅读 · 0 评论 -
剑指offer系列之顺时针打印矩阵
本题是牛客网剑指offer系列中的顺时针打印矩阵, 题目意思简洁明了, 按照从外到内顺时针的顺序打印矩阵中的每一个数字. 因为实验室师兄在面试中遇到了两次问这个问题的, 所以就来复习一下, 分享几个思路.思路一该思路较为直接, 如同剥洋葱一样, 一层一层剥开它的心. 用 4 个整数来表示当前矩阵圈的左右上下边, 每次顺时针打印一圈, 然后再改变这 4 个整数.主要问题是在于对于最后出...原创 2019-08-13 21:18:08 · 74 阅读 · 0 评论