算法
文章平均质量分 57
Kukeoo
记录自己的学习生涯
展开
-
算法 查找 【剑指 Offer 53 - II. 0~n-1中缺失的数字】
目录一、题目描述二、思路步骤三、代码一、题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例2:输入: [0,1,2,3,4,5,6,7,9]输出: 8二、思路本题的中心思想为二分查找。根据题意,数组可以按照以下规则划分为两部分。左子数组:nums[i] = i...原创 2021-05-02 23:10:07 · 157 阅读 · 0 评论 -
算法 栈和队列 【剑指 Offer 09 用两个栈实现一个队列】
一、题目描述用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )二、思路栈的特性:后进先出队列的特性:先进先出利用这个特性,我们可以让两个栈分别扮演不同的角色。我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。为了维护队列先进先出的特性,我们引入第二..原创 2021-04-30 23:36:07 · 138 阅读 · 1 评论 -
算法 动态规划 【机器人路径问题】
目录一、题目描述二、思路动态规划题目类型 1.确定状态 2.转移方程 3.初始条件和边界情况 4. 计算顺序三、代码一、题目描述给定m行n列的网格,有一个机器人从左上角(0,0)出发,每一步可以向下或者向右走一步,问有多少种不同的方式走到右下角。二、思路动态规划题目类型1、计数:有多少种方式走到右下角有多少种方法选出k个数使得和为Sum2、求最大最小值:从左上角走到右下角路径的最大数字和最长上升子序列长度3、求存...原创 2021-04-23 23:49:46 · 3338 阅读 · 0 评论 -
算法 查找 【剑指 Offer 04 二维数组中的查找】
一、题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 ...原创 2021-04-22 21:50:25 · 261 阅读 · 0 评论 -
算法 动态规划 【最长回文子串】
目录一、问题描述二、思路1.确定状态2.转移方程3.初始条件和边界情况4.计算顺序三、代码一、问题描述给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"示例 3:输入:s = "a"输出:"a"示例 4:输入:s = "ac"输出:"a"限制:1 <= s.l原创 2021-04-21 23:04:00 · 1107 阅读 · 0 评论 -
算法 动态规划 【剑指 Offer 63 股票的最大利润】
一、问题描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。...原创 2021-04-20 22:44:19 · 175 阅读 · 0 评论 -
算法 动态规划 【剑指 Offer 42 连续子数组的最大和】
目录一、问题描述二、思路1.确定状态2.转移方程3.初始条件和边界情况4.计算顺序三、代码一、问题描述输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。二、思路仍然是动态规划四步法:1.确定状态 1.1 ...原创 2021-04-19 12:12:38 · 126 阅读 · 0 评论 -
算法 二叉树 【剑指offer 27 镜像二叉树】
目录一、问题描述二、思路三、举例四、代码一、问题描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ \2 7/ \ / \1 3 6 9镜像输出:4/ \7 2/ \ / \9 6 31示例1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]二、思路这道算法题我们采用递归的...原创 2021-04-18 15:49:23 · 121 阅读 · 0 评论 -
算法 二叉树 【中序遍历迭代版】
一、思路迭代法需要借助while循环和迭代栈。中序遍历的顺序:左-根-右遍历步骤:1.准备一个当前指针cur,指向根结点;2.开辟一个空的迭代栈;3.进入while循环。循环结束的条件是:当前指针为空并且迭代栈为空。 因为当前指针不为空,迭代栈为空的情况是:根结点还未入栈 当前指针为空,迭代栈不为空的情况是:当前指针指向了目前最左元素的左孩子,而这个孩子肯定是nullptr4.在大循环中,首先建立一个小循环,不断地将当前指针指向的结点入栈,然...原创 2021-04-17 22:43:51 · 1668 阅读 · 0 评论 -
算法 顺序表 【剑指offer 45 把数组排成最小的数 改】
剑指OFFER 45 改数组里的所有元素可以拆的情况输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。class Solution {public: vector<int> getSingleNumber(int n) { vector<int> ans; return ans; } void bubbleSort(vecto.原创 2021-04-14 23:46:27 · 116 阅读 · 0 评论 -
算法 二叉树 【先序遍历迭代版】
一、思路先序遍历分为递归版,迭代版和著名的Morris遍历。今天我们要分享的遍历法是迭代版。由于不允许使用递归,所以我们需要借助一个辅助栈。先序遍历的遍历顺序:根-左-右。所以我们的遍历方法是:0.非空判断。1.根结点入栈。--开始while循环,条件为栈不为空--2.栈顶元素出栈,进入到结果序列中。(因为栈顶元素就是此时应当遍历的根结点。)3.如果根结点右孩子不为空,则根结点的右孩子结点入栈。4.如果根结点左孩子不为空,则根结点的左孩子结点入栈。5.进入下原创 2021-04-12 23:31:14 · 1001 阅读 · 0 评论 -
算法 排序 【归并排序】
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <iostream>using namespace std;int a[1000] = {0,8,7,4,9,3,5,10,6};int temp[1000];//mid指的是右边元素第一个角标,l,r为左边界和右边界void merge(int l, int r, int mid){ //左子序列首元素角标 int i = l; /.原创 2021-04-11 16:12:14 · 469 阅读 · 0 评论 -
算法 排序 【快速排序】
void quickSort(vector<int>& v,int L,int R){ if (L >= R) { return; } int left = L; int right = R; int pivot = v[left]; while (left < right) { //找到右指针指向的第一个比pivot小的元素 while (left < right && v[right] >= pivot) {.原创 2021-04-10 22:44:51 · 156 阅读 · 0 评论 -
算法 回溯 【详解N皇后问题】
一、问题介绍原创 2021-04-05 23:13:45 · 1975 阅读 · 0 评论 -
算法 栈和队列 【LeetCode 946 合法出栈顺序】
一、题目二、思路准备入栈序列与出栈序列,一个空栈。其中,入栈系列和出栈序列用vector存储,其中,出栈序列我们用一个index指向首元素,来模拟队列。然后元素12345按照顺序入栈。元素1入栈后,需要判断他和出栈序列中,index指向的元素,也就是队列首元素3是否相同,如果相同,则同时弹出栈顶元素和队头元素,直到栈空或栈顶元素与队头元素不相同,否则,继续将入栈序列中的元素入栈。经过多轮操作,如果最终栈为空,则说明出栈顺序合法;否则不合法。三、代码原创 2021-03-20 15:28:06 · 606 阅读 · 0 评论 -
算法 链表 【求两个链表的公共交点】
一、题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)二、思路长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL。长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。三、代码class Solution {public: ListNode* FindFirstCommonNode( ListNode *pHead1原创 2021-03-19 23:10:15 · 128 阅读 · 0 评论 -
算法 动态规划 【青蛙跳台阶DP版】
一、题目与分析一只青蛙跳n个台阶,一次可以跳一阶,一次也可以跳两阶,问一共有多少种跳法。这显然是动态规划中的计数问题。我们按照DP步骤来一步一步分析:1确定状态1.1.研究最后一步一共n阶台阶,青蛙的跳法为最后一次跳了1阶加上前n-1阶的跳法,与最后一次跳了2阶加上前n-2阶的跳法。1.2.化为子问题x阶台阶有多少种跳法2 转移方程f[n] = f[n-1]+f[n-2]3 初值和边界3.1 初值f[0] = 0;f[1] = 1;.原创 2021-03-17 21:45:07 · 889 阅读 · 0 评论 -
算法 动态规划 【初识DP之硬币问题】
一、动态规划题目类型1.计数问题有多少种方式走到右下角有多少种方法选出k个数,使和为sum2.求最大值最小值从左上角走到右下角路径的最大数字和最长上升子序列长度3.求存在性取石子游戏,先手是否必胜二、问题题目:有三种硬币,面值2.5.7,买一本书需要27元,如何用最少的硬币整好付清。很显然,这是一个求最大值最小值问题。三、四步骤1.确定状态动态规划需要开辟一个数组,数组的每个元素f[i]或者f[i][j]代表什么,类似数学题中的未知数代表原创 2021-03-13 16:27:56 · 1415 阅读 · 0 评论 -
算法 字符串【子串是否为回文串】
本题为笔试真题。一、描述给定一个字符串,从中任意删除一个字符,判断该字符是否为回文串。回文串:从左至右与从右至左遍历得到的串为相同串。如:输入abccba,abccba删除第一个c后得到abcba,这是回文串,则输出;若不是回文串,则输出false。二、思路写了三个主要逻辑函数:首先需要一个函数来逆转字符串;需要一个函数来判断是否为回文串;还需要一个函数删除字符串的某个位置的字符。具体看代码实现——三、代码#define _CRT_SECUR原创 2021-03-10 22:28:18 · 241 阅读 · 0 评论 -
数据结构 二叉树【记录:二叉树的操作】
注:本文不做详细讲解,注释仅在代码段中,作个人记录使用详解请看往日博客记录:博客类型为数据结构或算法目录一、二叉树结构二、创建二叉树三、插入,使之成为二叉搜索树四、三大遍历五、返回高度六、层序遍历七、重建二叉树一、二叉树结构typedef struct BNode{ int data; BNode* left; BNode* right;}BNode,*Tree;二、创建二叉树Tree createTree(){ int value.原创 2021-03-10 18:39:53 · 111 阅读 · 0 评论 -
数据结构 链表【记录:单链表的操作】
注:本文不做详细讲解,注释仅在代码段中,作个人记录使用一、链表的结构//链表的结构typedef struct Node{ int data; Node* next;}Node,*LinkedList;二、链表的头插法//链表的头插法LinkedList creatH(){ //创建头结点,为头结点分配空间 Node* head = (Node*)malloc(sizeof(Node)); //头结点的next域置空 head->next = NULL;原创 2021-03-10 15:13:00 · 130 阅读 · 0 评论 -
算法 链表 【牛客网NC4 判断链表是否有环 遍历解法】
题目描述在这篇文章里:https://blog.csdn.net/Kukeoo/article/details/114461881本篇讨论遍历解法。多一种解法,多一种思维。一、思路这个思路很容易理解,但是时间复杂度更大。将每次遍历过的结点加入到一个unordered_map容器中。每次存放的时候判断当前节点是否存在,如果存在,说明有环,直接返回true。否则返回false。二、代码class Solution {public: bool hasCycle(List原创 2021-03-06 23:19:48 · 124 阅读 · 0 评论 -
算法 链表 【牛客网NC4 判断链表是否有环 快慢指针解法】
一、题目描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。给出空间复杂度为O(1)的解法。二、思路一个有环的链表如下图:这里要用到快慢指针的思想。有兴趣了解的朋友可以看看这一道题:算法 链表【牛客网HJ51 输出单向链表中倒数第K个结点 快慢指针解法】:https://blog.csdn.net/Kukeoo/article/details/114272321这道题也运用了快慢指针。回归本题:定义一个快指针,一个慢指针。快指针.原创 2021-03-06 23:13:26 · 160 阅读 · 0 评论 -
数据结构 树【重建二叉树】
一、题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。输入[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值{1,2,5,3,4,6,7}二、思路本题思路是递归思想。首先分析根结点,将这棵树分成根+左+右的结构,再依次将其左子树和右子树..原创 2021-03-05 22:59:44 · 227 阅读 · 0 评论 -
数据结构 树【二叉树的广度优先搜索:层序遍历】
前言-新方法尝试以前学完知识或写完算法题后,直接就写博客记录下来。然而因为记录完博客后,以为知识都记住了,就没有再管。但过了不久,知识和算法就只记得五成了,典型的掌握不牢固。所以今天试一试新的方法,在学完知识或做完题后,不要急着记下来,而是每天晚上抽一段时间,重新做一遍题,想一遍知识,再将今天学到的知识或解题思路总结成博客。每过三五天,再回头看一遍博客来加深印象,慢慢吃透。过一段时间和大家反馈效果。今天分享一个经典算法:二叉树的广度优先搜索:层序遍历。【这道题同时也是牛客网的原创 2021-03-04 22:33:20 · 277 阅读 · 1 评论 -
算法 字符串【英语老师的单词卡消除】
一、题目描述英语老师有无数张单词卡,每张卡片上有一个小写英文单词。现在将卡片打乱,然后依次排成一串:如:AEEECCFFFCD每三张连续相同的卡片可以消除,上述案例最后可以消除成:AD如果一串可以完全消除成功,则输出0;如果一串无法完全消除,则输出其消除完所有可消除的单词卡后,剩下的有序串。二、思路首先要有一个判断函数,这个函数的功能是判断所给字符串能否进行消除。如果能,则返回消除的那三个字母的前一个字母的下标;如果不能,则返回-1。还需要一个判断长度函数。.原创 2021-03-03 23:15:34 · 218 阅读 · 0 评论 -
数据结构 树【返回高度与最大值】
一、返回高度一棵树的高度如下:思路:利用递归的思想:如果一棵树是空树,那么返回0;如果不是空树,进行以下步骤:1、记录结点本身,并将高度赋为1;2、记录结点左子树的高度和右子树的高度,取左右子树高度的最大值,记为max;3、结果即为max+1。以上是一个递归过程。递归出口:结点为NULL,则返回0.代码://树的高度int get_height(Node* node){ if (node == NULL) { return 0; } el原创 2021-03-03 16:05:48 · 468 阅读 · 0 评论 -
数据结构 树【二叉搜索树】
一、介绍本质上也是一个递归。看下图:我们要将一个序列的值,按照顺序插入二叉树中。其中:第一个插入的是根节点之后插入的结点,如果比父结点小,则向左遍历,将其左子树当成下一次遍历的父结点;如果比父结点大,则向右遍历,将其右子树当成下一次遍历的父结点。直到父结点的某棵子树是空的,而这个结点的下一次遍历正好到该子树的根结点时,进行插入。二、思路不断利用递归进行判断。这里要尤其注意,传参需要传递二级指针!因为我们传入的树本身是一个指针,我们需要改变这个指针的值(分配空间),原创 2021-03-03 00:23:27 · 122 阅读 · 0 评论 -
数据结构 树【二叉树的创建、三大遍历、销毁】
一、基本结构定义://树结点typedef struct Node{ int data; Node* left; Node* right;}Node,*Tree;其中,data为其数据域,left和right分别为其左孩子指针和右孩子指针。别名:Node指针别名:Tree二、二叉树的建立假设我们要建立一颗这样的树:那么直接用代码实现是这样的: Node* n1 = (Node*)malloc(sizeof(Node)); Node* n2原创 2021-03-02 19:41:44 · 1081 阅读 · 0 评论 -
算法 链表【牛客网HJ51 输出单向链表中倒数第K个结点 快慢指针解法】
还是上一道题,题号为牛客网HJ51。参考了大佬的思路,本题可采用快慢指针。设置快慢两个指针:快指针走K步,然后慢指针才开始走。初始位置均为不放元素的头结点。这样快指针走到最后一个结点的下一个位置,也就是NULL的时候,慢指针正好走到了倒数第K个结点。这个方法比起上一篇中,我的逐个遍历法,其实时间复杂度差不多,但是想法很新颖,以后也许会经常用到,所以在此记录。Node* Number(LinkedList L){ //记录链表的长度 int k; cin >>原创 2021-03-01 21:40:53 · 172 阅读 · 0 评论 -
算法 链表【牛客网HJ51 输出单向链表中倒数第K个结点】
本题为链表结构题,我用的办法是从前往后遍历。一、题目描述输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。链表结点定义如下:structListNode{intm_nKey;ListNode*m_pNext;};正常返回倒数第k个结点指针,异常返回空指针本题有多组样例输入。输入描述:输入说明1输入链表结点个数2输入链表的值3输入k的值输出描述:输出一个整数示例1输入81 ...原创 2021-03-01 19:56:08 · 603 阅读 · 0 评论 -
算法 字符串【牛客网HJ88 扑克牌比大小 巧用string容器】
借助本题我们来复习一下string类。先看题:一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):345678910JQKA2jokerJOKER输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4444-jokerJOKER。请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR。基本规则:(1)输入每手...原创 2021-02-27 20:43:27 · 344 阅读 · 0 评论 -
算法 链表【牛客网HJ48 初用STL容器与算法解题】
今天试一下使用STL提供的常用容器与算法来解决一道简易算法题。题目描述:输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。链表的值不能重复。链表长度不大于1000,每个节点的值不大于10000。本题含有多组样例。输入描述:1输入链表结点个数2输入头结点的值3按照格式插入各个结点4输入要删除的结点的值输出描述:输出删除结点后的序列,每个数后都要加空格输入523 24 35 21 4...原创 2021-02-27 18:01:48 · 150 阅读 · 0 评论 -
算法 链表 【牛客网NC78 单链表逆转】
一、题目描述输入一个链表,反转链表后,输出新链表的表头。示例1输入{1,2,3}返回值{3,2,1}二、思路三、代码原创 2021-02-27 14:25:38 · 242 阅读 · 0 评论 -
算法 排序 【详解希尔排序】
希尔排序时间复杂度:特定范围时情况:O(n^1.3) 最坏情况:O(n²)稳定性:稳定,因为每次插入都是从后向前,所以不会发生相对位置改变。希尔排序也是一种插入排序,又称缩小增量排序。基本思想:将待排序表分割成若干形如L【i,i+d,i+2d,......,i+kd】的特殊子表,即把相隔某个“增量”的记录组成一个子表,对各个子表分别进行直接插入排序。当整个子表中的元素已呈“基本有序”时,再对全体记录进行一次插入排序。为什么这样做?因为对于直接插入排序,若元素本..原创 2021-02-22 00:33:36 · 278 阅读 · 0 评论 -
算法 排序 【详解插入排序】
插入排序时间复杂度:O(n²)稳定性:稳定,因为每次插入都是从后向前,所以不会发生相对位置改变。这个排序算法相较于前面两种算法要难实现一些。看了很多网上的代码,但是感觉可读性不是很强,于是决定自己动手写一个属于自己的版本。先讲思想:对于N个元素,我们分成三组:第一组:待插入序列第二组:待插元素第三组:剩余元素组举个栗子现在有这样一组数:4,3,2,1由于第一个元素自己为一组,所以我们可以从第二个元素开始,看成第一趟插入排序。那么第一原创 2021-02-21 22:15:02 · 387 阅读 · 0 评论 -
算法 排序 【选择排序,冒泡排序】
一、排序分类插入排序:直接插入排序折半插入排序希尔排序交换排序:冒泡排序快速排序选择排序:简单选择排序堆排序此文我们介绍选择排序,冒泡排序。二、选择排序时间复杂度:O(n²)稳定性:不稳定,因为若第i个元素和另一元素交换,而其关键字大小相同的另一元素在前两者中间,可能导致相对位置改变。选择排序的基本思想是:每 i 趟排序都选出一个最小的元素,放在第 i 个位置上;i 为正整数,由1依次递增到元素个数减1。代码:首先用原创 2021-02-21 21:58:07 · 86 阅读 · 0 评论 -
数据结构 链表【单向链表的初始化,头插法建立,尾插法建立,插入,删除】
前言本篇讨论的均为带头结点的单链表。一、单链表的初始化先上结构体:typedef struct Node{ int data; Node* next;}Node,*LinkedList;Node为struct Node的别名,LinkedList为struct Node*,也就是链表指针的别名。代码:LinkedList LinkedListInit(){ Node* L; L = (Node*)malloc(sizeof(Node)); if (L ==原创 2021-02-19 16:49:21 · 2188 阅读 · 0 评论 -
数据结构 链表【单向链表的介绍与结点实现】
一、前言曾经学数据结构,总是基于抽象化的学习,比如链表的插入,二叉树的平衡旋转,图的DFS和BFS等。然而,实践和代码能力才是一个程序员的硬实力,所以我决定在此开一个新的专栏——数据结构,来记录我对抽象数据结构用C++的一一实现。今天我学习链表中的:单向链表的建立,插入,删除二、链表的概念链表实际上是线性表的链式存储结构,与数组不同的是,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的。且链表的长度不是固定的,链表数据的这一特点使其可以非常的方便地实现节点的.原创 2021-02-19 11:57:35 · 647 阅读 · 2 评论 -
C语言入门笔记 第六讲【递归之青蛙跳台阶】
负一、我的想法昨天晚上睡前看了一下问题描述,讲的是一只青蛙跳n个台阶,一次可以跳一阶,一次也可以跳两阶,问一共有多少种跳法。当时我的思路是:先想了n=1和n=2的情况,当n=1时,只有一种跳法--即1;当n=2时,有两种跳--11或者2因为小青蛙一次可以跳1或者2,所以我想把n=1和n=2的情况作为递归出口。比如,n=3的情况,就相当于小青蛙跳了一个2,和一个1并且他们之间是可以有顺序的,一共两种顺序:小青蛙先跳一个n=1,再跳一个n=2;小青蛙先跳一个n=.原创 2021-01-20 11:44:31 · 283 阅读 · 0 评论