![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法刷题
来一包板栗
知乎主页:
https://www.zhihu.com/people/ai-yin-si-tan-lu-dai-ma
展开
-
排序算法——希尔排序
1、希尔排序希尔排序是插入排序的一种改进,该算法冲破O(n2)的第一批算法之一。希尔排序通过比较相距一定间隔的元素进行工作,距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。因此,希尔排序也叫缩小增量排序。希尔排序的最坏时间为N的二次方,不过使用不同的增量序列可使得最坏运行时间降低。1.1希尔排序的基本步骤计算增量gap=length/2; 对每一组gap进行简单的插入...原创 2018-09-28 14:34:25 · 294 阅读 · 0 评论 -
剑指offer 栈的压入弹出顺序
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:建立一个辅助栈,对比栈是否为空和栈顶元素是否和弹出序列的元素一致,如果不一致...原创 2019-06-09 13:35:10 · 171 阅读 · 0 评论 -
剑指offer 包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路:定义一个辅助栈就OK,比如原始栈为stack1,辅助栈为stack2(用于保存目前栈1的最小元素,放在栈顶)。当一个value需要push入栈1时,我们需要判别栈2栈顶的元素和value的值大小,如果value较小,同时把value值push进栈2,如果value值大,则...原创 2019-06-01 14:30:41 · 122 阅读 · 0 评论 -
剑指offer顺时针打印数组
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.注意:初始化几个变量,指定每次循环打印一圈的边界点,打印一次后,调整边界点。还要注意判别条件,自己可以画一个随...原创 2019-06-01 14:00:23 · 112 阅读 · 0 评论 -
剑指offer 合并链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ...原创 2019-05-29 00:20:29 · 105 阅读 · 0 评论 -
剑指offer 判断是否是子树
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class So...原创 2019-05-29 00:18:59 · 265 阅读 · 0 评论 -
剑指offer 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: vo...原创 2019-05-29 00:19:04 · 106 阅读 · 0 评论 -
剑指offer 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pH...原创 2019-05-23 21:33:51 · 112 阅读 · 0 评论 -
剑指offer
题目描述输入一个链表,输出该链表中倒数第k个结点。两种比较简答的解法:1:先对链表遍历一遍统计节点个数count,然后从链表头走count-k+1步刚好达到倒数第k个节点。需要注意的是:第一次遍历前需要保存一下输入的链表,等下第二次寻找需要用,不然报错啊。如下代码:/*struct ListNode { int val; struct ListNode *next; Li...原创 2019-05-23 20:46:35 · 101 阅读 · 0 评论 -
剑指offer 调整元素位置,使得奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。class Solution {public: void reOrderArray(vector<int> &array) { int length = array.s...原创 2019-05-23 15:41:11 · 159 阅读 · 0 评论 -
剑指offer 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。class Solution {public: double Power(double base, int exponent) { if(panduan(base,0.0)&&exponent<0){ ...原创 2019-05-23 15:39:57 · 121 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树前序、中序、后序的非递归遍历可以借助栈实现(递归形式转为借助栈和循环实现),层序遍历可以借助队列实现。在构思遍历的步骤时,可以在纸上随意画一个三层的二叉树,用栈后进先出的思想去尝试。struct BinTree{ int pRoot; BinTree *left; BinTree *right;};截图来自浙大数据结构课件1、先序遍历遇到一个节点,将其push入栈...原创 2019-03-22 19:47:08 · 127 阅读 · 0 评论 -
链表-删除有序链表中的重复节点
剑指offer上的题目:在一个排序链表中有重复节点,删除。直接上代码,里面有解释很清楚。struct ListNode{ int m_value; ListNode* m_next;};void DeleteDuplication(ListNode** pHead){ if(pHead==nullptr && *pHead == nullptr) re...原创 2019-03-19 23:20:06 · 340 阅读 · 0 评论 -
链表-删除链表的节点
剑指offer的一个题,题目是要求在最少的时间内删除链表的节点。问题分析:对于链表的删除,按照剑指offer的一贯思路就是展开讨论:1、空链表咋办、待删除的节点是空节点咋办;2、要删除的节点在链表中的位置有三种情况:1、链表只有一个节点,待删除节点是表头又是尾节点;2、链表有多个节点,待删除的节点是尾节点;3、要删除的节点不是尾节点。我们的思路是:读入待删除节点的下一个节点的信息,用待删除...原创 2019-03-19 23:07:47 · 173 阅读 · 0 评论 -
刷题1:连续子数组的最大和
题目:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。问题输入就是一个数组,输出该数组的“连续子数组的最大和”。1、暴力法枚举出所有的子序列,求出最大和数值。比如对于从i开头的...原创 2019-02-26 21:15:59 · 492 阅读 · 0 评论 -
排序算法——快速排序
1、快速排序的原理快速排序(QuickSort)是对冒泡排序的一种改进,也是最好的一种内排序。基本思想:在待排序的元素随机任取一个元素作为基准(通常选第一个元素),称为基准元素; 将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边; 对左右两个分区重复以上步骤直到所有元素都是有序的。2、快速排序的示例图快速排序动态示意图3、快速排序的时间复杂度和稳定性...原创 2018-10-07 23:27:09 · 340 阅读 · 0 评论 -
剑指offer 从上到下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:属于二叉树遍历的层序遍历,可以借助队列实现。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { ...原创 2019-06-09 15:09:24 · 114 阅读 · 0 评论