数据结构与算法
Suqing_2018
这个作者很懒,什么都没留下…
展开
-
剑指Offer——面试题40:最小的 K个数
题目描述最小的 K 个数算法分析可以利用划分函数实现,循环此函数直到返回值是 k-1 ,此时 0 - k-1 即为最小的 K 个数程序代码class Solution {public: int Partition(vector<int> &input, int start, int end) { int temp = input[st...原创 2020-03-11 10:07:23 · 175 阅读 · 0 评论 -
剑指Offer——面试题33:二叉搜索树的后序遍历序列
题目描述二叉搜索树的后序遍历序列算法分析后序遍历的特点:左子树 -> 右子树 -> 根节点二叉搜索树:左子树节点的值都小于根节点,右子树节点的值都大于根节点结合两者的特点就可以发现,比如数组 {7,4,6,5} ,5 是 根节点,7 是右子树,根节点上没有左子树,但 4 比根节点值要小,所以不满足特点,不是二叉搜索树的后序遍历。程序代码注意递归结束条件的位置可以多样,...原创 2020-03-01 10:21:09 · 209 阅读 · 0 评论 -
剑指Offer——面试题7:重建二叉树
题目描述重建二叉树算法分析要注意前序遍历和中序遍历的特点,利用递归的思想实现程序代码/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), l...原创 2020-02-29 22:27:44 · 170 阅读 · 0 评论 -
剑指Offer——面试题32:从上到下打印二叉树
题目描述从上到下打印二叉树算法分析二叉树的层序遍历,通过使用辅助队列来完成,注意 root == nullptr 的情况程序代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NUL...原创 2020-02-29 11:40:35 · 116 阅读 · 0 评论 -
剑指Offer——面试题31:栈的压入、弹出序列
题目描述栈的压入、弹出序列算法分析判断一个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,直接弹出;如果下一个弹出的数字不在栈顶,则压入还没有入栈的数字直到需要弹出的数字压入栈顶为止,如果所有数字都压入仍然没有找到需要弹出的数字,则不是弹出序列程序代码class Solution {public: bool IsPopOrder(vector<int&g...原创 2020-02-28 15:47:55 · 209 阅读 · 0 评论 -
剑指Offer——面试题30:包含min函数的栈
题目描述包含min函数的栈原创 2020-02-27 11:42:04 · 103 阅读 · 0 评论 -
剑指Offer——面试题26:树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)算法分析题目不难,主要分为两个步骤:确定从哪个结点开始寻找子结构 B , 相当于是对树的遍历从当前结点开始,是否存在子结构 B这两个步骤分别对应两个函数,都可以用递归实现程序代码/*struct TreeNode { int val; struct TreeNode *l...原创 2020-02-17 10:17:40 · 124 阅读 · 0 评论 -
剑指Offer——面试题25:合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。算法分析图片来源于剑指Offer书籍首先比较链表1和链表2的头结点,确定合成后链表的头指针,之后继续合并两个链表中的剩余的节点,用递归的方法一直做下去程序代码/*struct ListNode { int val; struct ListNode *next;...原创 2020-02-14 11:43:07 · 112 阅读 · 0 评论 -
剑指Offer——面试题24:反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。算法分析题目比较常规,逐一调整链表中的指针方向即可,期间会涉及到三个指针 Previous、Current、Next,需要注意的是,代码鲁棒性的考虑,比如输入链表为空,链表只有一个节点等特殊情况。程序代码/*struct ListNode { int val; struct ListNode *next; Li...原创 2020-02-14 11:29:22 · 111 阅读 · 0 评论 -
剑指Offer——面试题23:链表中环的入口节点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。算法分析当用一个指针难以解决问题时,可以尝试用多个指针分析。假如我们能够知道环上结点的数目 n , 设置指针 pNode1 和 pNode2,pNode2 先走 n 步,之后 pNode1 和 pNode2 开始遍历,当 pNode1 == pNode2 时,即为入口节点。具体来讲:设置两个指针 ...原创 2020-02-14 11:22:22 · 129 阅读 · 0 评论 -
剑指Offer——面试题22:链表中倒数第K个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。k从1开始计数。算法分析普通思路:先确定链表的长度 n(需要一次遍历), 再根据 k 算出节点正数的位置,通过再次遍历确定返回的节点。此方法需要两次遍历链表,难以让面试官满意剑指Offer思路:设置两个指针,p1 和 p2,它们之间正好有 k 节点,之后 p1 和 p2 向后遍历,直到 p2 指向链表的尾结点,此时 p1 指向链表的...原创 2020-02-13 10:17:36 · 178 阅读 · 0 评论 -
剑指Offer——面试题5(b):合并两个数组
题目描述有两个排序的数组 A1 和 A2,内存在 A1 的末尾有足够多的空余空间容纳 A2。请实现一个函数,把 A2 中的所有数字插入 A1 中,并且所有的数字是排序的算法分析在合并两个数组或者字符串时,如果从前往后复制每个数字或字符则需要重复移动数字或字符多次,故可以考虑从后往前复制,减少移动的次数。具体来说:首先要确定合并后数组 Array 的大小,之后从 Array 最后一位开始...原创 2020-02-12 15:16:07 · 220 阅读 · 0 评论 -
剑指Offer——面试题21:调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分算法分析题目比较简单,设置两个指针 p1 和 p2 分别指向数组的开始和结尾,p1向后遍历,p2向前遍历,如果发现 p1 指向偶数,p2 指向奇数(即偶数在奇数之前),则将两者交换,一直做下去,直到 p1 > p2程序代码class Solution {p...原创 2020-02-12 11:07:31 · 99 阅读 · 0 评论 -
剑指Offer——面试题15:二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。算法分析初看题目,很可能将输入的整数每次右移一位,然后判断最低位是否为1决定数目是否加1,但是有符号数右移时,左边补的是符号位,如果是负数,左边的符号位为1,右移时左边补1,会引起死循环。所以方法有两种设置 flag = 1每次将 flag 左移,判断整数的每一位是否为 1 。利用位运算特点把一个整数减去1...原创 2020-02-11 11:55:39 · 104 阅读 · 0 评论 -
剑指Offer——面试题20:表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。算法分析题目的核心在于表示的数值的字符串遵循的模式,即 A[.[B]][e|EC] 或者 .B[e|EC], 其中 A 为整数部分,B ...原创 2020-02-11 11:19:03 · 193 阅读 · 0 评论 -
剑指Offer——面试题19:正则表达式匹配
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配算法分析初看题目比较复杂,因为有好多种可能匹配的情况,所以需要分多种情况进行讨论,题目的难点在...原创 2020-02-10 11:14:48 · 149 阅读 · 0 评论 -
剑指Offer——面试题18(b) 删除链表中的重复节点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5算法分析思路比较简单,遇到重复的节点就删除,但是需要将问题考虑完全,具体的来讲链表首元素重复。比如输入的链表为1->1->2->3->3-...原创 2020-02-09 17:21:38 · 243 阅读 · 0 评论 -
剑指Offer——面试题18(a):删除链表的节点
题目描述给定单向链表的头指针和一个节点指针,定义一个函数在 O(1) 时间内删除该节点。算法分析如果顺序查找节点并删除,其时间复杂度为 O(n),无法满足题目要求。为此将待删除节点 p 的下一个节点 p_Next 的信息复制给 p , 删除 p_Next 即可满足 O(1) 的复杂度要求 。但要注意特殊情况的处理链表只有一个节点,待删除节点为头结点时:将头指针赋值为nullptr待...原创 2020-02-08 18:23:15 · 171 阅读 · 0 评论 -
剑指Offer——面试题17:打印从1到最大的n位数
题目描述输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的三位数999题目分析初看题目比较简单,但是由于n的大小未知,无论是 int 还是 long long 都不一定满足要求,此问题实则为大数问题,一般通过字符串或者数组来解决。本题用字符串解决,主要完成利用字符串实现十进制数的加法(或利用排列组合得到1到最大的n位十进制数),字符串的打印程序...原创 2020-02-08 15:53:47 · 95 阅读 · 0 评论 -
剑指Offer——面试题16:数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0题目比较简单,但是需要全面考虑问题,主要是对幂次进行分类,1. exponent > 0这种情况只需要进行常规操作,无需特殊处理2. exponent = 0当 base = 0 时,无意义,题目要求不存在此情况当 ...原创 2020-02-07 11:12:20 · 93 阅读 · 0 评论 -
动态规划——剑指Offer面试题14:剪绳子
动态规划——剑指Offer面试题14:剪绳子转载至https://blog.csdn.net/weixin_38278878/article/details/80037455学习动态规划,愚认为,就是解决以下的三个问题:什么是动态规划?什么时候要用动态规划?怎么使用动态规划?让我们一个一个来解决!1、什么是动态规划?这里参考百度百科,动态规划是求解决策过程最优化的数学方法。把多阶段过程...转载 2020-02-06 11:50:38 · 188 阅读 · 0 评论