算法
pardon110
这个作者很懒,什么都没留下…
展开
-
不讲武德 移除链表元素[203]
迭代/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} head * @param {number} val * @return {ListN原创 2021-05-05 23:11:54 · 103 阅读 · 0 评论 -
合并K个已排序链表
需求合并 k 个已排序的链表并将其作为一个已排序的链表返回[{1,2,3},{4,5,6,7}] // 入参{1,2,3,4,5,6,7} // 返回分治+递归用二分法把列表进行中间拆分融合每个小列表中的链表,反向func mergeKLists( lists []*ListNode ) *ListNode { if lists == nil{ return nil }else if len(lists) == 1 { return l原创 2020-12-31 13:06:48 · 406 阅读 · 0 评论 -
go 原子数量
原子式给定一个化学式,输出所有原子的数量。格式为:第一个(按字典序)原子的名子,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。输入: formula = "K4(ON(SO3)2)2"输出: "K4N2O14S4"解释: 原子的数量是 {'K': 4, 'N': 2, 'O': 14, 'S': 4}。所有原子的第一个字母为大写,剩余字母都是小写。formula 的长度在[1, 1000]之间。formula 只包含字母原创 2020-12-28 12:59:08 · 283 阅读 · 0 评论 -
N皇后
代码func solveNQueens(n int) [][]string { rs := [][]string{} var queen func(int, []int) queen = func(cur int, q []int){ if cur == n { rs = append(rs, trans(q,n)) return } for i:=0;i < n;i++ {原创 2020-12-24 11:57:31 · 207 阅读 · 0 评论 -
单词搜索详解
题面给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = “ABCCED”, 返回 true给定 word = “SEE”, 返回 true给定 word = “ABCB”, 返回 fa原创 2020-12-21 11:31:42 · 644 阅读 · 0 评论 -
Go小根堆 数组中的第K个最大元素
题面在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4小根堆小根堆确保堆的长度为ktype IntHeap []intfunc (h IntHeap) Len() int { return len(h) }func (h IntHeap) Less(i, j int) bool { return h[i] <原创 2020-12-05 19:29:18 · 378 阅读 · 1 评论 -
go 自定义最大堆 实现频率排序
题面给定一个字符串,请将字符串里的字符按照出现的频率降序排列。输入:"tree"输出:"eert"解释:'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sort-characters-by-frequency堆排序实现go 堆的 heap.Interface 接口自定义依据重复次数实现最大堆排序规则原创 2020-12-05 13:31:28 · 232 阅读 · 0 评论 -
golang 数组的相对排序
题面两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输出:[2,2,2,1,4,3,3,9,6,7,19]分析自定义排序,合理描述规则排序规则与索引,值,可哈希相关原创 2020-11-14 11:09:55 · 725 阅读 · 0 评论 -
滑动窗口 最小覆盖子串
基本模板定义状态向右增大窗口向左缩小窗口持续迭代void window(string s, string t) { unordered_map<char, int> window, target; for (char c : t) { ++target[c]; } int left = 0, right = 0; // 初始化双指针 ... // 定义状态值 while (right &l原创 2020-10-03 12:25:28 · 312 阅读 · 0 评论 -
golang 用栈实现路径求和
题面输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回[ [5,4,11,2], [原创 2020-10-01 11:45:18 · 157 阅读 · 0 评论 -
golang 递归 栈 生成括号
与序列相关的问题,参数栈+链表+循环的形式通常更高效对于复用性强,在递归生成括号往往就没有上述高效问题给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。例如,给出n=3,解集为:"((()))", "(()())", "(())()", "()()()", "()(())",递归关键 当前位置左括号不少于右括号golang 字符串不可变,故可用字节切片生成字符串append 生成的数据依赖于底层数组,有可变性,正常情况下用copy计数边界,分层递进与回溯,回溯期.原创 2020-09-27 16:37:26 · 152 阅读 · 0 评论 -
php非递归层序化数据库记录
需求从数据库读取到一系列分类记录,如下$arr = array(array('id' => 1, 'pid' => 0, 'name' => '分类1'),array('id' => 2, 'pid' => 0, 'name' => '分类2'),array('id' => 3, 'pid' => 0, 'name' => '分类3'),array('id' => 4, 'pid' => 2, 'name' => '分类2-原创 2020-09-27 13:03:03 · 103 阅读 · 0 评论 -
虚节点dummy
起源原因对链表而言因头结点的上一个节点不存在,很多对于其他节点,需要用上上一个节点的操作对头结点就不适合,通常就需要单独考虑头结点,若单独考虑头,一个不小心产生许多bug虚拟节点~dummy在链表的头部放入一个哨兵,然后连上head节点。之后就把head节点当做普通节点,就不用单独考虑各种奇葩问题了ListNode* dummy=new ListNode(-1); dummy->next=head;最后返回 return dummy->next;题面给定一原创 2020-09-26 19:51:56 · 1375 阅读 · 0 评论 -
golang 非递归先序 与卡特兰数
非递归分析读取数据是出栈顺序出栈来自栈顶,与数据入栈顺序相反在出栈的同时,考察出栈元素可能产生新的入栈情况出栈的栈顶元素可能会产生新的入栈需求,一出多入,后入先出func preorderTraversal( root *TreeNode ) []int { if root == nil{ return nil } rs :=[]int{} stack :=[]*TreeNode{root} for len(stack)> 0 {原创 2020-09-21 23:18:31 · 257 阅读 · 0 评论 -
golang 中后序遍历构建二叉树
题面根据一棵树的中序遍历与后序遍历构造二叉树。假设树中没有重复的元素中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回二叉树 3 / \ 9 20 / \ 15 7分析中序遍历将二叉树分成左右两棵子树 (左 根 右)后序遍历最后访问根结点 (左 右 根)递归建树因此可以递归建树先记住中序遍历中每个数出现的位置,通常用hash。(题目条件:不存在重复数,如果存在重复数会更原创 2020-09-17 13:17:54 · 378 阅读 · 0 评论 -
栈的春天 反转每对括号的子串
栈的使用花样百出,多栈会简化很多问题题面给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。输入:s = "a(bcdefghijkl(mno)p)q"输出:"apmnolkjihgfedcbq"来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-substrings-between-each-pair-of-.原创 2020-09-14 12:45:57 · 175 阅读 · 0 评论 -
括号的分数
递归虽简单明了,但能不用尽量不用题面给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:() 得 1 分。AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。(A) 得 2 * A 分,其中 A 是平衡括号字符串。示例输入: "(()(()))"输出: 6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/score-of-parentheses递归本质 寻找拆解当层子串,及条件递归,加,乘法描述平衡字符.原创 2020-09-13 09:28:46 · 765 阅读 · 0 评论 -
来自数学的降维打击
问题给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。四平方定理任何正整数都可以拆分成不超过4个数的平方和 —> 答案只可能是1,2,3,4若一个数最少可以拆成4个数的平方和,则这个数还满足 n = (4^a)*(8b+7) —> 因此可以先看这个数是否满足上述公式,如果不满足,答案就是1,2,3了若这个数本来就是某个数的平方,那么答案就是1,否则答案就只剩2,3了如果答案是2,即n=a2+b2,那原创 2020-09-11 12:46:22 · 968 阅读 · 0 评论 -
算法 求下一个更大的元素
题面给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]分析使用单调栈,出栈针对栈顶单调递增或递减,单步多出直到出栈不不再符合条件p原创 2020-09-08 20:53:09 · 159 阅读 · 0 评论 -
golang 栈之删除重复项
删除重复项使用golang双向链表重当栈import "container/list"import "strings"func removeDuplicates(S string) string { stack :=list.New() var b strings.Builder for i:=0;i<len(S);i++ { if stack.Len() > 0 { if stack.Back().Value.(b原创 2020-09-07 19:50:10 · 261 阅读 · 0 评论 -
php栈之数组与SplStack
SPL(php标准库)提供了SplStack 双链表结构类作为栈的实现类,也可用数组简单替代栈特点先进后出不像列表,有去无回,栈可返回,即天生具备回退功能栈由于一直是在一端操作,因此适合判断成双成对的场景匹配,当全部取完意味为空全部匹配删除最外层括号有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串.原创 2020-09-06 19:01:15 · 340 阅读 · 0 评论 -
golang最大子序和
题面给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。分析比较老实的方法,计算所有可能的子序和,取最大值 M*N问题本质在于若干个子序和可能需要被重置,即确定重写的时机若上次求和值小于当前新进值且上次求和小于0,则sum 需要被置为新进程,后开始持续累加实现import "math"func ma原创 2020-09-04 20:38:43 · 168 阅读 · 0 评论 -
golang 外观数列
题面给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:作者:力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业原创 2020-09-03 18:11:22 · 167 阅读 · 0 评论 -
golang 双指针滑动区间
思路双指针通常在滑动区间算法中使用,与KMP尽可能的复用已计算的信息思想一致。先确定可能的边界条件,预估充分出现在计算过程中动态调整指针区间,区间大小,移动求最大最小,至少要遍历一次给定的目标区,但可以M+N就不必M*N最大连续1的个数给定一个二进制数组, 计算其中最大连续1的个数。输入数组的长度是正整数,且不超过 10,000。输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.算法func findMaxCons原创 2020-09-03 10:22:28 · 408 阅读 · 0 评论 -
golang 实现 strstr
题面实现 strStr() 函数。分析KMP 不用了,高效但反人类排除特殊情况子串为空,返回0,其它未找到返回 -1子串窗口区间同步比对,被查串标识实现func strStr(haystack string, needle string) int { if len(haystack) < len(needle){ return -1 } if len(needle)==0 { return 0 } rs :=-1原创 2020-09-02 15:15:30 · 271 阅读 · 0 评论 -
golang 对角线遍历
题面给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。示例:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]![在这里插入图片描述](https://img-blog.csdnimg.cn/20200901185316306.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR原创 2020-12-24 12:01:04 · 236 阅读 · 0 评论 -
golang单链表反向
题面反转一个单链表输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL递归func reverseList(head *ListNode) *ListNode { if head == nil { return nil } if head != nil && head.Next==nil { return head }原创 2020-08-30 19:04:14 · 171 阅读 · 0 评论 -
golang 两两交换链表中的节点
题面给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs分析基例关系,约束退出条件,递归前依赖,与后依赖当层退出,不代表整个行为结束了,它会返回上一层(回退),执行上一层递归原创 2020-08-29 15:00:25 · 346 阅读 · 1 评论 -
goalng 之 二叉树的中序遍历
题面给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,3,2]进阶: 递归算法很简单,你可以通过迭代算法完成吗?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal栈思想栈具有先进后出的特点,典型的记忆回退效果,下例栈在整个循环期从无到有,再至虚无是动态变化,大部分节点都访问了两次import "container/list"原创 2020-08-28 19:37:09 · 150 阅读 · 0 评论 -
php 已知前中序重构二叉树
已知先序遍历与中序遍历,可以确定重建一颗二叉树,本例用php演示题面输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。(注存在空结点)上图演示了先序遍历 根->左子->右子, 中序遍历 左子->根–>右子分析分治的思想来解决根据先序遍历,可知道根节点就是给定数组的第一个元素pre[.原创 2020-07-30 19:17:25 · 211 阅读 · 0 评论 -
php自定义排序函数
一般而言系统库函数效率高,有时站在巨人的肩膀上也不失为一种解决办法最小数字需求输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。分析全排列组合,选择最小的一个对两个数字依据字符串拼接形式,自定义排序规则实现function PrintMinNumber($numbers){ usort($numbers,function($a,$b){ .原创 2020-07-30 12:23:34 · 715 阅读 · 0 评论 -
顺时针打印矩阵
游戏也能开拓思路题面输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路分析常规解法:每轮打印一圈外围内层分方向上,右,下,左外层控制循环次数,但易越界魔方逆时旋转,每次取第一行,即为旋转后的效果,被涂部分即为每次想要的结果每次取完第一行,该行丢弃,将剩下的.原创 2020-07-29 20:24:39 · 107 阅读 · 0 评论 -
golang 二进制链表转整数
题面给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer输入:head = [1,0,1]输出:5解释:二进制数 (101) 转化为十进制数 (5)解法 type ListNode s原创 2020-07-23 11:25:37 · 205 阅读 · 0 评论 -
golang希尔排序
概述思路 先将整个待排序的记录序列分割成为若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。希尔排序亦称之为增量递减排序,是对插入排序的改进,因此有必要先了解下插入排序。插入排序工作原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。算法主要在于移动有序序列位置,寻找被插入数据在有序数据中的位置点,其golang 与 python 算法如下func insertSort(arr []int) []int {原创 2020-07-16 13:10:11 · 211 阅读 · 0 评论 -
golang快速排序详解
合理假设对于任意无序数组中的任意一个元素,如何确定它在排序后的索引位置?通常思路是先对无序数组排序,后遍历该有序数组,比较与给定的元素值,得到有序索引值。那么,是否存在一种不对无序数组排序,就可知其指定元素在排序后的索引位置?不排序求排序后位置有序的基础,是按照一定顺序有规律排序。假定是升序,那么排序必为如 a < b <c ,即,只要找到该值比其前面元素大,比后面的元素小,就可确定它在有序数组中的位置arr = [25, 84, 21, 46, 13, 27, 68, 35,原创 2020-07-15 17:09:33 · 676 阅读 · 0 评论 -
根据二叉搜索树数组建立树结构对象
前言二叉树遍历顺序先序遍历 根->左->右中序遍历 左->根->右后良遍历 左->右->根若将遍历数据当一维数组存储,通常需要中序遍历与 先序或后序两相结合,才能画出一棵完整的二叉树。但遵行【先上后下,从左右至右】的打描方式,组成的层序单个数组,也可画出一颗树,如下所示(空结点用null表示)如上所示,实际层的是一棵完全二叉树,它的存储一维数组为[10,5,15,3,7,13,18,1,null,6]。该数组描述的其实是一个在某序列中寻找6的查找树过原创 2020-07-14 10:45:26 · 575 阅读 · 2 评论 -
迭代 VS 递归
迭代通常是有序的水平扩张,而递归层层嵌套,先进后出,以始为终通常来说递归都可用迭代来演绎,但前者更易理解,对心智负担比较轻迭代以目录文件查找器为例,只关注文件的情况下,迭代更有优势// 关注同类问题的退出// 收集目录对象,处理目录对照func scanFile(dir string) []string { // 文件结果集 var result []string // 目录收集器 dirList := []string{dir} // 将层级目录,变成同一级下所有目录遍历 f.原创 2020-07-12 09:39:57 · 215 阅读 · 0 评论 -
java实现单链表反向
实现单链表反向两种算法,迭代与递归链表线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接单向链表每一个元素都有一个指针域,指针域一般是存储着到下一个元素的指针需求链表的基本形式是:1 -> 2 -> 3 -> null,反转需要变为 3 -> 2 -> 1 -> null访问某个节点 curt.next 时,要检验 curt 是否为 null。要把反转后的最后一个节点(即反转前的第一个节点)指.原创 2020-07-10 21:27:40 · 283 阅读 · 0 评论 -
vue父子通信之三数定值求和
需求假定三数不大于n的整数v1,v2,v3,其和为n要求改变任意数值,其它两数会自适应调整,确保三数和仍为n调用规则 : 假定三数顺序固定索引为 0,1,2, 那么0数值增加了,则1数优先减少,不够则向2数借,即0->1->2->0->1->2…顺序假定初始值分别为 40, 30, 30 , 定值和100,实现页面改变输入改变任意数,其它二数按规则自动变更分析父组件维护初始的数据信息数组及定值被改变数值的组件向父组件发出事件时,携带当前改变的值,以及当前值所原创 2020-07-10 15:06:18 · 524 阅读 · 0 评论 -
地址树数据查找
链表式节点数据查找,与地址树数据算法伪树已知后端数据结构如下,要求只返回最里面的id=8,获得最里面那个节点,用name组织的节点路径root/北京市/西城区/xx居委会let root = [ id: 5, name: "root", children: [{ id: 6, name: "北京市", children: [{ id: 7, name: "西城区", .原创 2020-07-08 14:50:38 · 360 阅读 · 0 评论