【算法】
Leetcode,牛客,欢迎任何OJ题
JoyCheung-
平心静噪
展开
-
【算法】JZ54 二叉搜索树的第k个节点
题目链接给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。题解中序遍历结果是升序的。把问题转化成,在搜索二叉树中,中序找第k个结点。/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */// 法一:递原创 2022-05-01 20:42:39 · 754 阅读 · 1 评论 -
【算法】JZ77 按之字形顺序打印二叉树
题目链接给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)题解/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: ve原创 2022-05-01 19:53:53 · 271 阅读 · 0 评论 -
【算法】JZ73 翻转单词序列
题目链接此题先对每一个单词进行逆置,然后再整体逆置。类似此题。题解class Solution {public: void _reverse(string& str, int start, int end) { // [start, end) int i = start, j = end-1; while(i < j) { swap(str[i], str[j]);原创 2022-05-01 15:40:08 · 423 阅读 · 0 评论 -
【算法】JZ74 和为S的连续正数序列(场景转化为模型,滑动窗口)
题目链接描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?返回值描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序题解在[1,S]区间内,找和为S的连续正数序列。定义两个整型,分别原创 2022-04-30 22:26:37 · 91 阅读 · 0 评论 -
【算法】JZ55 二叉树的深度
题目链接输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。题解1/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: i原创 2022-04-30 18:19:29 · 436 阅读 · 0 评论 -
【算法】JZ45 把数组排成最小的数(报错:reference to non-static member function must be called)
问题在牛客做题的时候出现了一个问题:reference to non-static member function must be called题目原题如下:题目链接描述输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。1.输出结果可能非常大,所以你需要返回一个字符串而不是整数2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0数据范围:原创 2022-04-30 14:41:11 · 202 阅读 · 0 评论 -
【算法】JZ38 字符串的排列(全排列问题,DFS)
题目链接输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。回溯法1、添加当前数据2、剪枝(因为会存在重复的字符串)3、DFS4、回退一步class Solution {public: bool IsExist(vector<string>& ret, string str) {原创 2022-04-29 14:29:51 · 396 阅读 · 0 评论 -
【算法】JZ34 二叉树中和为某一值的路径(二)[回溯法]
题目链接回溯法定义结果集合待选结果集,分别存放最后结果和本次结果。分为以下四步:1、先把当前值添加进待选结果集2、判断当前结果是否满足条件3、深度优先遍历4、回退/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {publi原创 2022-04-27 14:11:21 · 816 阅读 · 0 评论 -
【算法】剑指offer - JZ33 二叉搜索树的后序遍历序列
题目链接输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。BST:二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。后序遍历按照左子树,右子树,根的顺序进行遍历。分析BST的后序遍历序列的合法序列是,对于一个序列s,最后一个元素是x(root结点),去掉最后一个元素,剩下的元素序列可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合原创 2022-04-10 14:28:28 · 1255 阅读 · 0 评论 -
【算法】剑指offer - JZ76 删除链表中重复的结点
题目链接在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。分析1、确定去重的范围,采用 前开后闭 的方法。2、增加一个头结点,统一操作。(prev, last]的三种情况1、last->nextnullptr,整张没有重复区间2、last->next nullptr (prev, last],确定有重复区间,prev->next = last->next(nullptr)3、last->next != nullpt原创 2022-04-09 20:48:47 · 360 阅读 · 0 评论 -
【算法】剑指offer - JZ27 二叉树的镜像
题目链接操作给定的二叉树,将其变换为源二叉树的镜像。源二叉树镜像二叉树类比前序遍历or后续遍历先镜像反转根结点的左右子树,然后分别反转左子树和右子树。/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */class Solut原创 2022-04-09 17:18:10 · 390 阅读 · 0 评论 -
【算法】剑指offer - JZ26 树的子结构
题目链接输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构解题思路判断B是否是A树的子结构,先确定比较的起始位置(根结点的值相等),判断其左右子树是否也相等。如果返回false,在左右子树中继续递过查找。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode原创 2022-04-09 16:40:36 · 209 阅读 · 0 评论 -
【算法】剑指offer- JZ25 合并两个排序的链表
题目链接输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。法一:迭代每一次循环中,取较小数值的结点,尾插到新链表后。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* Merge(ListNode* pHead1, List原创 2022-04-09 15:53:33 · 954 阅读 · 0 评论 -
【算法】剑指offer - JZ22 链表中倒数最后k个结点
题目链接输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为 0 的链表。双指针法尤其要注意k值比结点个数多的情况!/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */class Solution {public: /**原创 2022-04-08 23:04:27 · 342 阅读 · 0 评论 -
【算法】剑指offer - JZ15 二进制中1的个数(x&(x-1))
题目链接输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。常规解法:位运算class Solution {public: int NumberOf1(int n) { int bit_1 = 1; int cnt = 0; for(int i = 0; i < 32; ++i) { if((n & bit_1) == 1)原创 2022-04-08 22:23:37 · 350 阅读 · 0 评论 -
【算法】剑指offer - JZ69 跳台阶(dp)
题目链接解题思路1、设f(n)表示跳上第n阶台阶的跳法数。2、则有状态转移方程,f(n) = f(n-1) + f(n-2)3、其中,f(0) = 1,f(1) = 1,f(2) = 2。C++解法一(数组)class Solution {public: int jumpFloor(int number) { // 动态规划 // f(n) = f(n-1) + f(n-2) // f(0) = 1, f(1) = 1, f(2) =原创 2022-04-08 20:45:53 · 256 阅读 · 0 评论 -
【算法】剑指offer - JZ10 斐波那契数列
题目链接迭代class Solution {public: int Fibonacci(int n) { int first = 1; int second = 1; int third = 1; while(n > 2) { first = second; second = third; third = first原创 2022-04-08 19:35:20 · 363 阅读 · 0 评论 -
【算法】剑指offer-JZ7 重建二叉树(递归)
题目链接给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。递归解法利用递归不断缩小问题的规模,通过下标进行控制。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *ri原创 2022-04-08 13:55:26 · 151 阅读 · 0 评论 -
【算法】剑指offer - JZ6 从尾到头打印链表
题目链接原创 2022-04-08 12:52:04 · 1016 阅读 · 0 评论 -
【算法】剑指offer - JZ39 数组中出现次数超过一半的数字
题目链接候选法(最佳解法)时间复杂度:O(N)空间复杂度:O(1)如果把数字当作人种,一个数字和另外数字打了起来,同归于尽,最后剩下的是不是人数最多的那种人。这里要满足一个条件:某类人的数目一定要大于总人数的一半。**算法步骤:**选择输入数组的第一个元素作为候选元素target,设置其出现次数为1,随后遍历数组,当遇到和target相同的元素,cnt+1;不同的元素,cnt-1.当cnt==0时,选择下一个元素作为候选元素,并且置cnt=1,遍历到数组的最后,剩下的target就是要求的结果。原创 2022-04-07 17:22:26 · 656 阅读 · 0 评论 -
【算法】剑指offer - JZ81 调整数组顺序使奇数位于偶数前面(二)
题目链接输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。双指针法左指针找偶数,右指针找奇数,找到后进行交换。class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * *原创 2022-04-06 22:20:08 · 104 阅读 · 0 评论 -
【算法】剑指offer - JZ21 调整数组顺序使奇数位于偶数前面(一)
题目链接输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路1从前往后遍历,偶数后移,腾出位置,放进奇数。class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector *原创 2022-04-06 22:07:05 · 393 阅读 · 0 评论 -
【算法】剑指offer - JZ11 旋转数组的最小数字(二分查找)
题目链接分析最小值存在于三个区间,分别是mid位置,mid左边,mid右边。left的值如果比下标mid的值要小,最小值在mid及mid的右边,left = mid。left的值如果比下标mid的值要大,最小值在mid及mid的左边,right = mid。边界条件循环条件是 while(rotateArray[left] >= rotateArray[right]),当下标left的值比下标right的值小的时候,此时数组有序,无需查找,直接返回下标mid对应的值即可。注意当原创 2022-04-06 19:34:19 · 883 阅读 · 0 评论 -
【算法】剑指Offer - JZ4 二维数组中的查找
题目链接分析这道题是查找的问题,本质是排除数据的问题。代码class Solution {public: bool Find(int target, vector<vector<int> > array) { int i = 0; // 行 int j = array[0].size()-1; // 列 while(i < array.size() && j >= 0)原创 2022-04-06 14:12:25 · 261 阅读 · 1 评论 -
【算法】Leetcode - 137. 只出现一次的数字 II
题目链接排序法先使用sort()函数对传入数组进行排序,获得一个有序序列再遍历该序列,如果遍历的点以下各节点为空或者与本节点值不相等,则该节点值就位只出现一个的数字否则节点向后移动3步,寻找下一个节点class Solution {public: int singleNumber(vector<int>& nums) { // 排序法 sort(nums.begin(), nums.end()); int原创 2022-04-04 16:13:28 · 1310 阅读 · 0 评论 -
【算法】Leetcode - 260. 只出现一次的数字 III(排序、异或法)
【算法】Leetcode - 260. 只出现一次的数字 III(排序、异或法)原创 2022-04-04 15:51:17 · 560 阅读 · 0 评论 -
【算法】125. 验证回文串
题目给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。怎么处理[忽略字母的大小写的条件]算法思想将字母统一转化为小写,然后首尾依次比较判断。class Solution {public: bool _isalphaanddigit(char a) { if((a >= '0' && a <= '9') ||(a >= 'a' &原创 2022-04-01 20:10:17 · 73 阅读 · 0 评论 -
【算法】557. 反转字符串中的单词 III
解题思路定位空格位置,分离出每一个单词,再对每一个单词进行反转。class Solution {public: void _reverse(string& s, int left, int right) { while(left < right) { swap(s[left], s[right]); ++left; --right; } }原创 2022-04-01 17:24:11 · 316 阅读 · 0 评论 -
【算法】HJ59 找出字符串中第一个只出现一次的字符
HJ59 找出字符串中第一个只出现一次的字符原创 2022-04-01 16:28:41 · 364 阅读 · 0 评论 -
【算法】594. 最长和谐子序列(排序+双指针滑窗)
题目链接题目和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示例 1:输入:nums = [1,3,2,2,5,2,3,7]输出:5解释:最长的和谐子序列是 [3,2,2,2,3]示例 2:输入:nums = [1,2,3,4]输出:2示例 3:输入:nums = [1,原创 2022-02-05 18:28:59 · 98 阅读 · 0 评论 -
【算法】1122. 数组的相对排序
题目链接题目给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。示例 1:输入: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]示例 2:输入:arr1 = [28原创 2022-02-05 15:54:21 · 516 阅读 · 0 评论 -
【算法】1609. 奇偶树
题目链接题目如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true ,否则返回 false 。输入:root = [1,10,4,3,null,7,9,12,8,6,null,null,2]输原创 2022-02-05 15:25:27 · 122 阅读 · 0 评论 -
【算法】1022. 从根到叶的二进制数之和
题目链接输入:root = [1,0,1,0,1,0,1]输出:22解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22解题思路本题使用 二叉树的深度遍历。其中,pathval计算各路径和,sum统计路径和。计算二进制的和 pathval = (pathval << 1) + root->val;void dfs(struct TreeNode* root, int pathval, int *sum){原创 2022-02-04 15:31:34 · 235 阅读 · 0 评论 -
【算法】1544. 整理字符串(栈实现)
题目链接解题思路此题可以采用 字符数组模拟栈实现。将需要整理的s的字符依次入栈,当栈中字符>=2时,检查栈顶两个元素是否互为大小写。如果互为大小写,弹出栈顶两个元素。char * makeGood(char * s){ // 数组模拟栈 int len = strlen(s); char* stack = (char*)malloc(len+1); int top = 0; // 指向栈顶 for(int i = 0; i < len; ++原创 2022-02-03 16:33:08 · 359 阅读 · 0 评论 -
【算法】1171. 从链表中删去总和值为零的连续节点
题目链接解题思路核心是添加一个头结点。要删去总和值为零的连续链表结点,只需维护每一个结点之前的所有和,此时如果该结点与前面结点的和相加结果为0,则该节点就可以抵消前面的结点,消除的时候就是把next指向和的下一个结点,重复该过程,直到整个链表求解结束。/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */stru原创 2022-02-02 20:14:29 · 375 阅读 · 0 评论 -
【算法】NC21 链表内指定区间反转
题目链接解题思路核心思路是借助临时头结点,找到需要翻转链表的前驱位置,然后将要翻转链表的结点摘下进行子链表的头部插入即可。对下列链表 m=2 n=4 进行链表翻转。借助临时头结点(解决m=1的问题)翻转链表的前驱结点head指向翻转链表头结点C语言实现:struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) { // 0/1个结点 if(head == NULL || head-&原创 2022-02-02 15:22:20 · 950 阅读 · 0 评论 -
字符串匹配算法:BF算法 && KMP算法
字符串匹配算法本章重点:1、暴力匹配(BF)算法2、KMP算法BF算法百度百科:BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。时间复杂度为O(M*N)。假定给出字符串"ababcabcdabcde",然后给出子串"abcd",现在查找原创 2021-12-08 18:38:54 · 583 阅读 · 19 评论 -
【图解算法】Leetcode 622. 设计循环队列
题目链接实际中我们有时还会使用一种队列叫循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。本文使用数组实现。循环链表实现此处不议。循环队列分析符合先进先出空间大小确定解题思路通过一个定长数组实现循环队列。入队:首先要判断队列是否已满,再进行入队的操作。入队操作要考虑索引循环的问题,索引越界时,需要让他变成最小值。出队:首先要判断队列是否为空,再进行出队操作,出队也需要考虑索引循环的问题。队空:队头 == 队尾队满:队尾+1 == 队头图解步骤开一个长度k=5的队列,原创 2021-11-04 11:00:00 · 254 阅读 · 2 评论 -
【图解算法】Leetcode 232. 用栈实现队列
题目链接解题思路数据结构中我们知道,队列的特点是先入先出。本题可以使用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作。出队操作:当出队的栈不为空时,直接进行出栈操作;如果为空,需要把入队的栈元素全部到日出队的栈,然后再进行出栈操作。图解分析push 1,2, 3,4pop 出队头元素,即1因为此时pop栈是空,就需要把push栈中的元素全部导入到pop栈中。队列结构由于OJ函数,要求队列在堆区开辟。所以队列结构为如下所示,这里我们使用 顺序表实现栈。补充:对于栈,数组实现原创 2021-11-03 08:51:21 · 711 阅读 · 13 评论 -
【图解算法】Leetcode 225. 用队列实现栈
题目链接解题思路栈的结构特点是后入先出。本题核心思路是:入数据时,往不为空的队列入数据,保持另一个队列为空。出数据,依次出掉队头数据到另一个队列,留下最后一个数据,pop图解定义两个队列q1和q2,第一步压入1, 2,3,4弹出4(后入的数据)压入 5,6,7栈结构本题中我们考虑到一个因素,函数是在栈区开辟的,栈帧随着函数结束而销毁,所以初始化的栈要放在堆区。代码题解typedef int QDataType;typedef struct QueueNode原创 2021-11-02 23:07:04 · 183 阅读 · 4 评论