![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
不蛋定
这个作者很懒,什么都没留下…
展开
-
leetcode-78:子集
题目描述给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]方法一:二进制位表示解题思路利用二进制来表示,长度为n的数组全组合的子集数量是2^n-1个元素从0到2^n-1每个数的二进制位表示一个子集原创 2021-07-14 01:35:22 · 84 阅读 · 0 评论 -
leetcode-198:打家劫舍
题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7原创 2021-07-12 16:09:19 · 69 阅读 · 0 评论 -
leetcode-55:跳跃游戏
题目描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一原创 2021-07-12 16:04:18 · 146 阅读 · 0 评论 -
leetcode-剑指offer-62:约瑟夫环
题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2方法一:暴力解解题思路维护链表,迭代进行删除,直至最后一个节点注意迭代原创 2021-06-18 17:23:13 · 355 阅读 · 0 评论 -
算法:排序:插入排序
题目描述插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。算法复杂度插入排序为稳定排序平均复杂度为O(n²)最坏复杂度为O(n²)最好复杂度为O(n)解题思路挨着遍历数列,前边为排好得,后边为未排的取到一个未排序的数,和前一个数比较,前一个数大,将前一个数向后移一位直到前一个数不大于当前未排序的数,将该数插入当前位置重复该步骤n-1次,将全部数归位代码实现f原创 2021-06-10 21:11:45 · 107 阅读 · 0 评论 -
算法:排序:选择排序
题目描述选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。算法复杂度选择算法不稳定最好最坏平均时间复杂度都是O(n²)解题思路默认第一个元素最小,和其他元素做对比,找到最小的,和第一个元素替换除过第一个,找其他元素中最小的,和第二个元素替换以此类推,经过n - 1次排序完成代码实现f原创 2021-06-10 17:43:06 · 55 阅读 · 0 评论 -
算法:排序:冒泡排序
题目描述冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒牌排序为稳定排序(如果a原本在b前面,而a=b,排序之后a仍然在b的前面)平均时间复杂度为:O(n²)最坏时间复杂度为:O(n²)最好时间复杂度为:O(n)空间负责都为O(1)解题思路从头开始比较相邻两元素,如果前边的大,就与后边原创 2021-06-10 17:06:40 · 96 阅读 · 0 评论 -
leetcode-剑指offer-11:青蛙跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解题思路同斐波那契数列,每次n都等于n-1 + n-2需要注意初始值不同代码实现func numWays(n int) int { if n == 0 { return 1 } if n == 1 || n == 2 { retu原创 2021-05-23 17:49:04 · 72 阅读 · 0 评论 -
leetcode-剑指offer-10:斐波那契数列
题目描述写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解题思路用递归在leetcode会超时采用动态规划思想,没明白怎么就动态原创 2021-05-23 17:37:21 · 80 阅读 · 0 评论 -
leetcode-剑指offer-07:重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解题思路前序遍历的第一个值为根结点,在中序遍历中找到该值的下标中序遍历该值左边为根结点左子树,右边为根结点右子树前序遍历从第一个节点往后数 与中序遍历左子树相同个数的节点,为左子树本轮分析得到根结点,以及左子树,右子树的值递归即可得到整个树代码实现/** * Definition for a binary tree node. * type TreeNode str原创 2021-05-23 17:18:51 · 135 阅读 · 0 评论 -
leetcode-剑指offer-09:用两个栈实现队列
题目描述剑指 Offer 09. 用两个栈实现队列解题思路用切片当作栈入队列用栈一,出队列用栈二出队列没有数据时将栈一整个入栈到栈二经过两次入栈出栈,其顺序刚好符合队列先进后出的特点代码实现type CQueue struct { stack1 []int stack2 []int}func Constructor() CQueue { return CQueue{}}func (this *CQueue) AppendTail(value int原创 2021-05-23 16:53:36 · 75 阅读 · 0 评论 -
leetcode-剑指offer-06:从尾到头打印链表
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。方法一解题思路递归,将链表节点的值依次返回代码实现/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func reversePrint(head *ListNode) []int { if head == nil {原创 2021-05-23 16:27:00 · 106 阅读 · 0 评论 -
leetcode-剑指offer-05:替换空格
题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。解题思路挨个字符判断,是空格,替换掉即可调用库函数更方便代码实现func replaceSpace(s string) string { res := "" for _, value := range s { if value == ' ' { res += "%20" } else { res += string(value)原创 2021-05-23 15:54:53 · 107 阅读 · 0 评论 -
leetcode-剑指offer-04:二维数组中的查找
题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路暴力法直接双重for循环二维数组有序,从右上角观察,像一颗二叉搜索树从右上角开始,大于目标值,向左移,小于目标值,向下移注意:判断边界条件;列值可以小到0代码实现func findNumberIn2DArray(matrix [][]int, target int) bool {原创 2021-05-23 15:42:31 · 96 阅读 · 0 评论 -
leetcode-201:数字范围按位与
题目描述给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。解题思路left到right中的所有数字按位与,其结果就是这些数字都为1的留下,其他全部置为0既求left到right这些数字的公共前缀将left和right每次右移一位,直到两数相等,得到公共前缀再将结果左移回原来位置代码实现func rangeBitwiseAnd(left int, right int) int {原创 2021-03-24 01:11:43 · 162 阅读 · 0 评论 -
leetcode-338:比特位计数
题目描述给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。方法一:暴力遍历解题思路参考如何求一个树中二进制1的个数对0-num进行遍历,依次统计代码实现func countBits(num int) []int { res := make([]int, num+1) for i := 0; i <= num; i++ { res[i] = count1(i) } return res}原创 2021-03-23 01:09:52 · 88 阅读 · 0 评论 -
leetcode-190:颠倒二进制位
题目描述颠倒给定的 32 位无符号整数的二进制位。解题思路颠倒二进制,则对于第i位,其颠倒之后应位于31-i位从右向左遍历二进制(n >>= 1)每次取出二进制的最后一位(n&1)将其移到正确的位置(n&1) << 31-i代码实现func reverseBits(num uint32) uint32 { res := uint32(0) power := uint32(31) for num != 0 { res += (num原创 2021-03-18 00:29:19 · 124 阅读 · 0 评论 -
leetcode-191:位1的个数
题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。解题思路每次将该数二进制的最后一位1置为0,然后统计结果加一直到该数的所有1位全被置为0,返回n&(n-1)可以将最后一位置0(下图来自leetcode)代码实现func hammingWeight(num uint32) int { res := 0 for num != 0 { // 将最后一位1置为0 num = num&am原创 2021-03-18 00:16:58 · 68 阅读 · 0 评论 -
leetcode-260:只出现一次的数字-iii
题目描述给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案方法一:位运算解题思路数组中有两个元素出现了一次。其余元素都出现了两次,将全部元素进行异或操作,最终结果是只出现了一次的两个数字的异或结果该结果为1的位上说明res1和res2不相同相与得到一个只有为1的位上不同,其余位上均为0的数,以此为依据将数组分为两部分第一部分是和该数相与为0的,第二部分是与该数相与为1的。因为res1和res2在该位上原创 2021-03-17 01:34:21 · 121 阅读 · 0 评论 -
leetcode-137:只出现一次的数字-ii
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。方法一:hash法解题思路以数组元素为key,将其出现的次数都存到map中遍历map,只出现一次的返回代码实现func singleNumber(nums []int) int { countMap := make(map[int]int) for _, v := range nums { count, ok := countMap[v] if ok { cou原创 2021-03-15 23:51:28 · 47 阅读 · 0 评论 -
leetcode-136:只出现一次的数字
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。方法一:hash法解题思路将数组中的元素存到map,重复就给其值加一遍历map,找到值为1的返回代码实现func singleNumber(nums []int) int { countMap := make(map[int]int) for _, v := range nums { count, ok := countMap[v] if !ok { countM原创 2021-03-15 23:42:25 · 53 阅读 · 0 评论 -
leetcode-106:从中序与后序遍历序列构造二叉树
题目描述根据一棵树的中序遍历与后序遍历构造二叉树。解题思路同前序中序序列后续遍历最后一个元素为根节点在中序序列中找到该元素下标取中序后序序列左子树:前 i 个元素重构左子树,i为中序根节点下标取中序后序序列右子树:中序为第i+1个到最后一个,后序为第i个到倒数第二个(最后一个是根节点)代码实现func buildTree(inorder []int, postorder []int) *TreeNode { if len(postorder) == 0 { return nil原创 2021-03-11 00:44:45 · 54 阅读 · 0 评论 -
leetcode-105:从前序与中序遍历重建二叉树
题目描述根据一棵树的前序遍历与中序遍历构造二叉树。解题思路前序遍历第一个节点为根节点重建根节点在中序遍历中找到跟节点下标前序遍历左子树节点为从跟节点下一个开始,到中序遍历的根节点下标加一;右子树为从中序遍历根节点下标加一到结束中序遍历分为左子树为从第一个到下标的前一个;右子树为下标的后一个到结束将前序遍历的左子树和中序遍历的左子树递归重构左子树同理用前序和中序的右子树节点递归重构右子树代码实现func buildTree(preorder []int, inorder []int)原创 2021-03-11 00:36:15 · 106 阅读 · 0 评论 -
leetcode-226:翻转二叉树/二叉树的镜像
题目描述翻转一棵二叉树。方法一:先序dfs解题思路交换根节点的左子树和右子树递归分别交换左子树的节点和右子树的节点代码实现func invertTree(root *TreeNode) *TreeNode { if root == nil { return root } root.Left, root.Right = root.Right, root.Left invertTree(root.Left) invertTree(root.Right) return root原创 2021-03-10 00:36:37 · 117 阅读 · 1 评论 -
leetcode-101:对称二叉树
题目描述给定一个二叉树,检查它是否是镜像对称的。解题思路类似相同的树将一个树当作两个树进行计算两个根节点是否同时为空两树根节点值是否相同递归检查第一个树的左子树和第二个树的右子树检查第一个树的右子树和第二个树的左子树是否满足上述条件代码实现func isSymmetric(root *TreeNode) bool { return check(root, root)}func check(p, q *TreeNode) bool { if p == nil &&am原创 2021-03-10 00:21:01 · 74 阅读 · 0 评论 -
leetcode-100:相同的树
题目描述给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。解题思路递归,两树同时为空,则相同两树不同时为空,则不同两节点值不同,则不同否则递归返回子树是否相同代码实现func isSameTree(p *TreeNode, q *TreeNode) bool { if p == nil && q == nil { return true } if p == nil ||原创 2021-03-10 00:12:48 · 56 阅读 · 0 评论 -
leetcode-98:验证二叉树搜索树
题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。方法一:中序遍历解题思路中序遍历验证中序遍历结果是否递增代码实现func isValidBST(root *TreeNode) bool { var res []int inOrder(root, &res) for i := 0; i < len(res)-原创 2021-03-09 01:15:15 · 117 阅读 · 0 评论 -
leetcode-701:二叉树搜索树中的插入操作
题目描述给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。解题思路分治法,如果当前节点为空,就将该值插入当前节点如果当前节点的值大于要插入的值,就在右子树寻找合适的位置否则就在左子树寻找合适的位置完成插入操作的左右子树覆盖旧的左右子树返回根节点代码实现func inse原创 2021-03-09 00:41:24 · 73 阅读 · 0 评论 -
leetcode-103:二叉树的锯齿形遍历
题目描述给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。解题思路类似层序遍历,使用flag控制是否要反转,每一轮更新代码实现func zigzagLevelOrder(root *TreeNode) [][]int { res := make([][]int, 0) if root == nil { return res } queue := make([]*TreeNode, 0) queue = appe原创 2021-03-07 18:27:45 · 62 阅读 · 0 评论 -
leetcode-107:二叉树的层序遍历 II
题目描述给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)解题思路同二叉树的层序遍历,将最终结果反转即可代码实现func levelOrderBottom(root *TreeNode) [][]int { res := levelOrder(root) return reverse(res)}func reverse(res [][]int) [][]int { for i, j := 0, len(res)-1; i &原创 2021-03-07 18:08:48 · 93 阅读 · 0 评论 -
leetcode-236:二叉树的最近公共祖先
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”解题思路分治法如果p或q是root,直接返回root分别去左右子树寻找根据左右子树返回结果判断 1.左右子树返回结果都不为空:说明p和q分别在左右子树,返回根结点 2. 其中一个子树返回为空,说明p和q都在那个子树,返回的结果是第一个原创 2021-03-07 17:21:20 · 77 阅读 · 0 评论 -
leetcode-124:二叉树中的最大路径和
题目描述路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。解题思路分治法分别求其左右子树的最大路径和返回与0进行比较,负增益弃用加上根结点和当前最大值比较并替换选左右子树增益大的加上根结点值返回给上一层go int32最大值:1<<31;最小值:-1<<原创 2021-03-07 17:01:35 · 141 阅读 · 0 评论 -
leetcode-111:二叉树的最小深度
题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。解题思路分治法分别求左右子树的最小深度,在进行比较,加一返回踩坑:根节点左子树或右子树为空时不构成子树,不符合要求代码实现func minDepth(root *TreeNode) int { if root == nil { return 0 } leftDepth := minDepth(root.Left) rightDepth := m原创 2021-03-05 01:00:45 · 82 阅读 · 1 评论 -
leetcode-110:平衡二叉树
题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。解题思路分治法左子树平衡,右子树平衡左右子树深度不超过一符合条件返回深度,否则返回-1(-1代表非平衡)代码实现func isBalanced(root *TreeNode) bool { if maxDepth(root) == -1 { return false } return true}func maxDept原创 2021-03-05 00:35:13 · 69 阅读 · 1 评论 -
leetcode-104:二叉树的最大深度
题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。解题思路分治法分别求左子树的最大深度和右子树的最大深度对比左右子树最大深度,深的加一返回代码实现func maxDepth(root *TreeNode) int { if root == nil { return 0 } leftDepth := maxDepth(root.Left) rightDepth := maxDepth(root原创 2021-03-05 00:26:23 · 82 阅读 · 1 评论 -
leetcode-102:层序遍历二叉树(BFS)
题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。解题思路将二叉树层序遍历结果装入二维数组利用队列保存每一层的节点,遍历每一层节点,保存值,并将下一层入队列遍历完一层之后将结果存入最终结果集合,开始下一轮,知道队列为空代码实现func levelOrder(root *TreeNode) [][]int { var res [][]int if root == nil { return res } var queue []*T原创 2021-03-04 00:06:11 · 108 阅读 · 1 评论 -
leetcode-145:树的后序遍历
题目描述给定一个二叉树,返回它的 后序 遍历。方法一:递归解题思路递归访问树先保存右子树返回值,再保存左子树返回值最后保存根结点的值代码实现func postorderTraversal(root *TreeNode) []int { var res []int if root == nil { return res } res = append(res, postorderTraversal(root.Left)...) res = append(res, postor原创 2021-03-02 23:58:10 · 86 阅读 · 0 评论 -
leetcode-94:树的中序遍历
题目描述给定一个二叉树的根节点 root ,返回它的 中序 遍历。方法一:递归解题思路中序遍历,先添加左子树返回值,再添加根节点的值,最后添加右子树的返回值代码实现func inorderTraversal(root *TreeNode) []int { var res []int if root == nil { return res } res = append(res, inorderTraversal(root.Left)...) res = append(res,原创 2021-03-01 23:02:55 · 90 阅读 · 0 评论 -
leetcode-144:树的前序遍历
题目描述给你二叉树的根节点 root ,返回它节点值的 前序 遍历方法一:递归解题思路前序遍历先保存根节点然后遍历左子树最后遍历右子树代码实现func preorderTraversal(root *TreeNode) []int { var res []int if root == nil { return res } res = append(res, root.Val) res = append(res, preorderT原创 2021-02-24 23:52:24 · 111 阅读 · 0 评论 -
leetcode-剑指offer-03:数组中重复的数组
题目描述在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3方法一:map哈希法解题思路遍历数组,检查map中是否存在,已存在则返回该数。不存在则存入map,继续遍历代码实现func findRepeatNumber(nums []int) int { numMap :原创 2021-02-21 14:37:08 · 88 阅读 · 0 评论