数据结构与算法
鹏割
勿忘初心
展开
-
如何计算时间复杂度
一、概念时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)比如:一般总运算次数表达式类似于这样:a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+fa ! =0时,时间复杂度就是O(2^n);a=0,bO(n^3);a,b=0,cO(n^2)依此类推eg:(1) for(i=1;i //循环了n*n次,当然是O(n^2) f转载 2015-06-12 22:29:44 · 646 阅读 · 0 评论 -
面试题——二进制中1的个数
题目: 实现一个函数,输入一个整数,输出该数的二进制表示中1的个数。 例如把9表示成二进制是1001, 有两位是1。 因此如果输入9,该函数输出2。考察的是位运算, 位运算一些基本操作: 与(&), 或(|),异或(^), 左移<<, 右移>> code:#include <stdio.h>int NumberOf1_Solution1(int n){ int count原创 2015-08-05 15:21:12 · 554 阅读 · 0 评论 -
快速排序
48 57 28 39 63 31 90 64 6 87i jx=48, i=0, j=length-1; 把他看成(48放入了x中): 57 28 39 63 31 90 64 6 87i原创 2015-08-05 23:02:13 · 483 阅读 · 0 评论 -
二叉树的镜像
题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像.//把每个非叶子结点的左右字数交换struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeNode(int n) : m_nValue(n), m_pLe原创 2015-08-18 21:47:51 · 570 阅读 · 0 评论 -
树的子结构
题目 输入两颗二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下:先在A中找B的跟节点,若找到相同的,在判断左右子树是否相同.struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeNode(i原创 2015-08-18 23:18:36 · 554 阅读 · 0 评论 -
冒泡排序
冒泡排序 设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交 换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就 “沉”到数组第N-1个位置。 3.N=N-1,如果N不为0就重复前面二步,否则排序完成void bubbleSort1(int arr[], int length){ for (int i = 0;原创 2015-08-07 11:29:32 · 450 阅读 · 0 评论 -
排序---直接插入排序
直接插入排序原创 2015-06-03 22:43:13 · 526 阅读 · 0 评论 -
面试题 ——— 二维数组的查找
解法, 可以从右上角或左下角的数开始, 与要寻找的数进行比较, 以左下角为例,如果要查找的数是9, 6小于9, 所以6所在的列都小于9, 删掉该列, 8 小于 9, 同理删掉该列, 11 大于9, 它右边的数肯定大于9, 删掉该行, 同理, 删掉 10 所在的行, 最后 9 等于 9 ,找到, 返回true。code:bool Find(int* arr, int rownu原创 2015-07-27 11:09:23 · 613 阅读 · 0 评论 -
包含min函数的栈
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1).思路 使用两个栈,一个数据栈用来存放数据,一个辅助栈用来存放最小值.#include <stack>#include <assert.h>template <typename T> class StackWithMin{publi原创 2015-08-20 15:41:24 · 765 阅读 · 0 评论 -
通过金矿模型介绍动态规划
对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节转载 2015-09-05 09:59:08 · 426 阅读 · 0 评论 -
二叉树的非递归遍历
1.前序遍历void preOrder(BinaryTree *pRoot) { if(pRoot == NULL) return; stack<BinaryTree*> pNode; BinaryTree *pTmp; pNode.push(pRoot); while(!pNode.empty()) { pTmp=pNode.to原创 2015-09-28 19:53:51 · 420 阅读 · 0 评论 -
最小的k个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。typedef multiset<int, greater<int> > intSet;typedef multiset<int, greater<int> >::iterator setIterator;class Solution {public: vecto原创 2015-09-18 10:51:12 · 382 阅读 · 0 评论 -
前缀中缀后缀表达式
它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。举例:(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式中缀表达式(中缀记法)中缀表达式是一种通用的算术或逻辑公式表示方法转载 2015-09-19 18:43:04 · 335 阅读 · 0 评论 -
丑数
题目: 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。code:class Solution { public: int GetUglyNumber_Solution(int index) { if (index原创 2015-09-20 21:18:59 · 424 阅读 · 0 评论 -
反转链表
题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点.ListNode* ReverseList(ListNode* pHead){ if (pHead == NULL) return NULL; ListNode* pPrev = NULL; ListNode* pNode = pHead; while (原创 2015-08-15 16:52:51 · 564 阅读 · 0 评论 -
旋转数组最小数字
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。 例如数组{3,4,5,1,2} 为{1,2,3,4,5}的一个旋转, 该数组的最小值为1。code:int Min(int* numbers, int length){ if (numbers == NULL || length < 0) {原创 2015-08-04 15:59:12 · 478 阅读 · 0 评论 -
c++实现哈希表
哈希表的几个概念:映像:由哈希函数得到的哈希表是一个映像。冲突:如果两个关键字的哈希函数值相等,这种现象称为冲突。处理冲突的几个方法:1、开放地址法:用开放地址处理冲突就是当冲突发生时,形成一个地址序列,沿着这个序列逐个深测,直到找到一个“空”的开放地址,将发生冲突的关键字值存放到该地址中去。例如:hash(i)=(hash(key)+d(i)) MOD m转载 2015-07-25 19:31:09 · 1064 阅读 · 0 评论 -
面试题 —— 替换空格(ReplaceBlank)
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。方法一: 从头到尾扫描字符串, 每次碰到空格字符就替换, 把空格后面所有字符后移两个字节。 假设字符串的长度是n。 对每个空格字符, 需要移动后面O(n)个字符, 因为对含有O(n)个空格字符的字符串而言总的时间效率是O(n2). 方原创 2015-07-27 22:21:57 · 1964 阅读 · 2 评论 -
栈的压入,弹出序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等, 例如序列 1,2,3,4,5 是某栈的弹出顺序. 序列4,5,3,2,1 是该栈序列对应的一个弹出序列, 但4,3,5,1,2就不可能是该栈序列的弹出序列.思路: 建立一个辅助栈,把输入的第一个序列中的数字一次进栈, 并按照第二个序列的顺原创 2015-08-22 15:30:48 · 735 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.#include <vector>#include <stdio.h>using std::vector;void FindPath(BinaryTreeNode* pRoot, int expectedSum, vector<int>& pa原创 2015-08-24 22:23:50 · 679 阅读 · 0 评论 -
从上往下打印二叉树
题目: 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.思路: 借助一个队列,先输出头节点,并把他的左右结点进队列,取队头,这个结点就是跟节点的左结点,输出并且把它的左右节点进队列. 因为队列是先进先出,所以到最后输出的就是按层次遍历的结果.void PrintFromTopToBottom(BinaryTreeNode* pTreeR原创 2015-08-22 16:22:08 · 757 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目: 输入一个整形数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false. 假设输入的数组的任意两个数字都互不相同.例如输入数组{5,7,6,9,11,10,8},则返回true. {7,4,6,5}则返回false.思路: 后序遍历最后一个结点是根结点. 从第一个结点开始,找第一个大于根结点的结原创 2015-08-22 21:49:27 · 581 阅读 · 0 评论 -
复杂链表的复制
题目: 实现函数ComplexListNode* Clone(ComplexListNode* pHead), 复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL.结点定义如下:struct ComplexListNode{ int m原创 2015-08-25 21:13:41 · 573 阅读 · 0 评论 -
面试题—— 从尾到头打印链表
链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;}1.先将链表逆置, 然后遍历输出 ,但这样做会改变原链表的结构。void reverseOutput(ListNode* pHead){ if (pHead == NULL) { return; } ListNode*原创 2015-07-30 17:29:01 · 595 阅读 · 0 评论 -
在O(1)时间删除链表结点
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext;};code://把待删结点后面一个结点的值赋给待删结点,然后把待删结点next指针指向下下个结点,然后删除下个结点, 达到和删除待删结点一样的效果.void DeleteNod原创 2015-08-12 18:34:06 · 827 阅读 · 0 评论 -
堆排序
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>转载 2015-08-27 14:44:56 · 349 阅读 · 0 评论 -
重建二叉树
题目 输入某二叉树的前序遍历和中序遍历,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。 例如,前序遍历序列:{1,2,3,7,3,5,6,8},中序遍历序列:{4,7,2,1,5,3,8,6}BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, in原创 2015-08-02 16:30:18 · 552 阅读 · 0 评论 -
链表中倒数第k个结点
题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个结点.双指针实现一次遍历就能找到,要注意代码的鲁棒性.code:ListNode* FindKthToTail(ListNode* pListHead, unsigned int k){ if (pListHead == NULL || k == 0) {原创 2015-08-15 12:00:27 · 586 阅读 · 0 评论 -
两个栈实现队列及两个队列实现栈
用两个栈实现队列的push() 和 pop()#include <iostream>#include <stack>#include <stdexcept>using namespace std;template <class T>class CQueue{ public: CQueue() {}; ~CQueue() {}; void appen原创 2015-08-02 18:43:11 · 617 阅读 · 0 评论 -
合并两个排序的链表
题目 输入两个递增排序的链表, 合并这两个链表并使新链表中的结点仍然是按照递增排序的.ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ if (pHead1 == NULL) return pHead2; else if (pHead2 == NULL) return pHe原创 2015-08-16 18:13:14 · 678 阅读 · 0 评论 -
Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).You are given a target value to search. If found in the array return its index原创 2015-10-26 21:35:17 · 324 阅读 · 0 评论