
数据结构与算法
majinbo111
这个作者很懒,什么都没留下…
展开
-
Leetcode 199. 二叉树的右视图
199. 二叉树的右视图层次遍历二叉树(BFS)/** * Definition for a binary tree node. * class TreeNode { * public $val = null; * public $left = null; * public $right = null; * function __construct($val = 0, $left = null, $right = null) { * $thi原创 2021-07-03 23:41:26 · 249 阅读 · 1 评论 -
Leetcode 147. 对链表进行插入排序 & Leetcode 148. 排序链表
https://leetcode-cn.com/problems/insertion-sort-list/初版复杂度如插入排序,最坏可能为O(n^2)/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* insertionSortList(struct ListNode* head.原创 2021-06-26 23:28:10 · 136 阅读 · 0 评论 -
Leetcode 1143. 最长公共子序列
1143. 最长公共子序列https://leetcode-cn.com/problems/longest-common-subsequence/给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的原创 2021-05-13 09:13:49 · 311 阅读 · 0 评论 -
串的模式匹配算法
串的匹配的应用场景例如:查找子串问题说一篇文章里搜索一条词句论文查重匹配算法介绍一般都是这两种算法法来匹配字符串,BF算法与KMP算法。BF算法原理:匹配串与主串按字符两两匹配;相同时,继续按字符匹配;不相同时,主串回溯到匹配开始加1的位置,匹配串回溯到起始位置。重复以上步骤,完整的匹配到子串,则表示成功,反之失败。废话不多说,直接上代码。#include <stdio.h>#include <string.h>int deal_pos (int pos原创 2021-05-09 17:10:27 · 718 阅读 · 0 评论 -
解决顺序表实现队列的假溢出的循环队列
循环队列的参考视频:https://www.bilibili.com/video/BV1nJ411V7bd?p=60问题:什么是顺序队列的假溢出?从队首倒到队尾完全占用了分配的空间,是溢出。相反,队尾元素占用了分配的最后一个空间,队首元素还是占有的不是第一个分配的空间,相当于队列对外是满的,但是内部空间利用不充分,还有剩余,此时就称为假溢出。解决假上溢的方法-引入循环队列把stack[0] 接在queue[MAXQSIZE-1]之后,若rear+1 == MAXQSIZE,则令rear=0;解.原创 2021-05-05 16:17:29 · 3015 阅读 · 0 评论 -
10进制转换为2~16进制
10进制数n转换为 base(2、8、18)进制的转换法则:除以base倒取余。简单原理:n=(n/base) * base + n%base (此处的除法为整除)/* * @Author: jinbo.ma * @Mail: 18710648068@163.com * @Date: 2021-04-30 16:07:07 * @LastEditTime: 2021-04-30 17:23:48 */#include <stdio.h>#include <stdlib.原创 2021-04-30 17:26:47 · 624 阅读 · 1 评论 -
复数计算 [(8+6i)*(4+3i)]/[(8+6i)+(4+3i)]= ?
计算复数 [(8+6i)*(4+3i)]/[(8+6i)+(4+3i)]= ?/* * @Author: jinbo.ma * @Mail: 18710648068@163.com * @Date: 2021-03-11 15:02:21 * @LastEditTime: 2021-03-13 16:50:20 */#include <stdio.h>typedef struct complex { double real, imag;} complex;voi原创 2021-03-13 16:51:40 · 874 阅读 · 0 评论 -
拓扑排序(leetcode 207、210)
拓扑排序有向无环图有向无环图:无环的有向图,简称DAG(Directed Acycline Graph)。有向无环图的应用有向无环图常用来描述一个工程或系统的进行过程(通常把计划、施工、生产、程序流程等当成一个工程)。一个工程可以分为若干个子工程,只要完成了这些子工程(活动),就可以使得整个工程完成。有向无环图分为两种表示方法,AOV网与AOE网。AOV网 (拓扑排序)用一个有向图表示一个工程的各个工程及其互相制约关系,其中顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活原创 2021-01-14 12:07:54 · 574 阅读 · 0 评论 -
leetcode 830. 较大分组的位置
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/positions-of-large-groups著作权归领扣网络所有在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。例如,在字符串 s = “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的一些分组。分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下.原创 2021-01-05 11:34:47 · 153 阅读 · 0 评论 -
动态规划-捞鱼问题
题目3个桶,5条鱼,每个桶中可放置0~3条鱼,请问共有排列有多少种 ?分析过程递归及动态规划代码#include <stdio.h>#include <stdlib.h>/************************************************ * 递归方式求剩余bucket个桶放置剩余fish条鱼的总分配方法 * ********************************************** * @param int bu原创 2020-12-29 18:13:35 · 353 阅读 · 0 评论 -
226. 翻转二叉树 & 剑指 Offer 27. 二叉树的镜像
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/invert-binary-tree著作权归领扣网络所有题目翻转一棵二叉树。备注:本题与 剑指 Offer 27. 二叉树的镜像 相同示例:输入: 4 / \ 2 7 / \ / \ 1 3 6 9输出: 4 / \ 7 2 / \ / \ 9 .原创 2020-12-29 15:34:38 · 144 阅读 · 0 评论 -
leetcode 198. 打家劫舍
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/house-robber著作权归领扣网络所有题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4 解释.原创 2020-12-28 16:46:13 · 211 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润 & 121. 买卖股票的最佳时机
题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof著作权归领扣网络所有。假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6原创 2020-12-28 14:31:35 · 180 阅读 · 0 评论 -
leetcode 1235. 规划兼职工作
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-profit-in-job-scheduling著作权归领扣网络所有。你打算利用空闲时间来做兼职工作赚些零花钱。这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。给你一份兼职工作表,包含开始时间 startTime,结束时间 endTime 和预计报酬 profit 三个数组,请你计算并返回可以获得.原创 2020-12-24 18:24:50 · 350 阅读 · 1 评论 -
排序算法-计数排序
计数排序-非比较排序计数排序是一个稳定的排序算法,输入元素是n个 0到k的直接的整数时,时间复杂度是O(n),空间复杂度也是O(n),其排序速度是超过任何比较算法的,但是运用场景比较局限,只有当k不是很大,并且序列比较集中时,计数排序是一个很有效的排序算法。#include <stdio.h>#include <stdlib.h>void print_array(int *a, int len) { for (int i = 0; i < len; i++)原创 2020-12-22 17:46:18 · 174 阅读 · 0 评论 -
排序算法-堆排序
引用&推荐:https://www.bilibili.com/video/BV1Eb41147dK堆定义堆,是通常是一个可以被看做一棵完全二叉树的数组对象。堆特性堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。完全二叉树的数组表示时的特性完全二叉树可以使用数组表示,树的节点层次遍历存放到数组,则会有如下关系:若父节点表示为 i,则子节点可以表示为:left = 2 * i + 1;right = 2 * i + 2; 逆推,如子节点为i,则父.原创 2020-12-21 15:43:09 · 169 阅读 · 0 评论 -
排序算法-快速排序
快速排序-比较交换类排序算法复杂度:最好=O(nlog n) 最差=O(n2) 平均=O(nlog n)算法稳定性:不稳定算法思想:分而治之#include <stdio.h>void print_array(int *a, int len) { for (int i = 0; i < len; i++) { printf("%d ", a[i]); } printf("\n");}int getIndex(int *a, int原创 2020-12-18 17:00:49 · 121 阅读 · 1 评论 -
排序算法-希尔排序
希尔排序-不稳定插入排序时间复杂度:平均=O(n1.3) 最坏=O(n2) 最好=O(n)#include <stdio.h>void print_array(int *a, int size) { for (int i = 0; i < size; i++) { printf("%d ", a[i]); } printf("\n");}/** * 希尔排序-不稳定插入类排序 */void shellSort(int *a原创 2020-12-18 15:31:16 · 131 阅读 · 1 评论 -
排序算法-归并排序
#include <stdio.h>#include <stdlib.h>/**没有利用空间的合并*/void insertMerge(int *a, int left, int mid, int right) { int i = mid+1, j, t; while ( i <= right) { // 把右边的值插入排序待左边 t = a[i]; j = i; while ( j > left原创 2020-12-17 18:24:59 · 107 阅读 · 0 评论 -
排序算法-选择排序
#include <stdio.h>void print_array(int *a, int size) { for (int i = 0; i < size; i++) { printf("%d ", a[i]); } printf("\n");}void selectSort(int *a, int size) { int t; while ( --size ) { //从右到左,从大到小 fo原创 2020-12-16 16:19:49 · 107 阅读 · 0 评论 -
leetcode 739. 每日温度
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/daily-temperatures著作权归领扣网络所有。题目请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0.原创 2020-12-08 15:17:41 · 241 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array著作权归领扣网络所有。给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?示例 1:.原创 2020-12-01 13:54:18 · 112 阅读 · 0 评论 -
leetcode 88. 合并两个有序数组
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-sorted-array著作权归领扣网络所有。给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = .原创 2020-11-30 18:24:38 · 161 阅读 · 1 评论 -
leetcode 144. 二叉树的前序遍历
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/著作权归领扣网络所有。给你二叉树的根节点 root ,返回它节点值的 前序 遍历。迭代法1-一层循环/** * Definition for a binary tree node. * class TreeNode { * public $val = null; * public $left = null;.原创 2020-11-24 10:32:41 · 98 阅读 · 0 评论 -
leetcode 98. 验证二叉搜索树
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/validate-binary-search-tree著作权归领扣网络所有。给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3 输出: true示例 2:输入: 5 .原创 2020-11-18 18:19:59 · 110 阅读 · 0 评论 -
leetcode 5603. 确定两个字符串是否接近
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/determine-if-two-strings-are-close著作权归领扣网络所有。如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :操作 1:交换任意两个 现有 字符。例如,abcde -> aecdb操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。例如,aacabb -> bbcbaa(所有 a .原创 2020-11-15 16:25:40 · 201 阅读 · 0 评论 -
142. 环形链表 II
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/linked-list-cycle-ii著作权归领扣网络所有。给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否.原创 2020-11-13 11:41:03 · 93 阅读 · 0 评论 -
leetcode 剑指 Offer 38. 字符串的排列
剑指 Offer 38. 字符串的排列来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof著作权归领扣网络所有。输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]限制:1 <= s 的长度 <= 8原创 2020-11-12 16:33:36 · 126 阅读 · 0 评论 -
538. / 1038. 把二叉搜索树转换为累加树
538. / 1038. 把二叉搜索树转换为累加树来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree著作权归领扣网络所有。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。原创 2020-11-12 16:19:32 · 186 阅读 · 0 评论 -
47. 全排列 II
47. 全排列 II来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations-ii著作权归领扣网络所有给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例 1:输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]示例 2:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,原创 2020-11-12 16:13:19 · 135 阅读 · 1 评论 -
46. 全排列
46. 全排列来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations著作权归领扣网络所有。给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]class Solution { /** * @param Integer[] $nums原创 2020-11-11 18:18:42 · 1429 阅读 · 0 评论 -
leetcode 39. 组合总和
39. 组合总和来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combination-sum著作权归领扣网络所有。给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates原创 2020-11-11 17:20:13 · 99 阅读 · 0 评论 -
90. 子集 II
90. 子集 II在 78. 子集 题减枝即可得到答案。class Solution { /** * @param Integer[] $nums * @return Integer[][] **/ private $res = []; function subsetsWithDup($nums) { sort($nums); //先排序 $this->dfs($nums, 0, []);原创 2020-11-11 16:43:21 · 100 阅读 · 0 评论 -
leetcode 78. 子集
78. 子集来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/subsets著作权归领扣网络所有。给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]方法一:迭代法实现子集枚举时间复杂度:O(n原创 2020-11-11 16:28:13 · 157 阅读 · 0 评论 -
leetcode 110. 平衡二叉树
110. 平衡二叉树来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/balanced-binary-tree著作权归领扣网络所有。给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true示例 2:输入:root = [1,2,2,3,3,nul原创 2020-11-10 15:53:26 · 153 阅读 · 0 评论 -
leetcode 剑指 Offer 55 - I. 二叉树的深度 / 104. 二叉树的最大深度
剑指 Offer 55 - I. 二叉树的深度 / 104. 二叉树的最大深度来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof著作权归领扣网络所有。输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。提示:节点总数原创 2020-11-10 14:23:38 · 117 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof著作权归领扣网络所有。请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的原创 2020-11-07 14:34:31 · 226 阅读 · 0 评论 -
leetcode 剑指 Offer 11. 旋转数组的最小数字 与 154. 寻找旋转排序数组中的最小值 II
寻找旋转排序数组中的最小值 II来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii著作权归领扣网络所有假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。示例 1:输入: [1,3,5]输出: 1示例 2原创 2020-11-07 14:05:25 · 688 阅读 · 1 评论 -
leetcode 153. 寻找旋转排序数组中的最小值
153. 寻找旋转排序数组中的最小值来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array著作权归领扣网络所有。假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。请找出其中最小的元素。示例 1:输入:nums = [3,4,5,1,2]输出:1示例 2:输入:nums原创 2020-11-07 11:01:16 · 140 阅读 · 0 评论 -
leetcode 62. 不同路径
62. 不同路径来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths著作权归领扣网络所有。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。原创 2020-11-06 18:06:42 · 696 阅读 · 1 评论