笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素
出题:把二元查找树转变成排序的双向链表。输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向;
分析:
- 递归的思路,当前节点需要进行的处理,并使用递归调用和返回值将子问题链接起来;
- 首先明白二元查找树的特性,变成有序双向链表后当前根节点的左节点为其原来左子树的最右节点,右节点为其原来右子树的最左节点;因此策略就是针对当前根节点索引的子树,首先判断其为上层节点的右子树还是左子树,从而决定返回最右还是最右节点;然后再递归处理当前根节点的左右子树;
解题:
#include <stdio.h>
#include <malloc.h>
#include <string.h> typedef struct Node {
int value;
Node *left;
Node *right;
} *NodePtr; Node* MostLeft(Node *current) {
Node* temp=current;
while(temp->left!=NULL) {
temp=temp->left;
}
return temp;
} Node* MostRight(Node *current) {
Node* temp=current;
while(temp->right!=NULL) {
temp=temp->right;
}
return temp;
} Node* Transfer(Node *current, bool isRight) { if(current==NULL) return NULL;
/**
* 在树结构被破坏之前预先查找好需要返回的节点
* */
Node* turnback = (isRight ? MostLeft(current) : MostRight(current));
/**
* 递归处理左右子树,将具体返回的节点推迟到子树解决
* */
if(current->left!=NULL) {
current->left=Transfer(current->left,false);
current->left->right=current;
}
if(current->right!=NULL) {
current->right=Transfer(current->right,true);
current->right->left=current;
}
/**
* 根据isRight的值,和current是否有左右子树返回不同的节点
* */
return turnback;
}
出题:定义stack数据结构,除Push和Pop函数外要求增加Min函数,其功能是找到stack中最小的元素,要求所有函数时间复杂度都是O(1);
分析:
- 使用辅助stack结构依次将目前的最小元素压入栈,设置CurMin元素记录当前stack中的最小元素,每次Push的新元素都与CurMin比较,若新元素更小则将其压入辅助栈;每次Pop元素都与CurMin比较,若就是CurMin元素则将辅助栈栈顶元素出栈;
解题:
class MyStack {
private:
int *array;
int capability;
int length;
int head;
int tail;
public:
MyStack(int n=): array((int*)malloc(sizeof(int)*n)), head(),tail(),capability(n), length() {}
~MyStack() {delete [] array;}
bool isFull() {
if(length == capability) return true;
return false;
}
bool isEmpty() {
if(length == ) return true;
return false;
}
/**
* head当前的指向位置是下一次将push的元素的
* */
bool push(int n) {
if(isFull()) return false;
array[head]=n;
head=(head+)%(capability+);
length++;
return true;
}
/**
* tail当前指向的位置是下一次将pop的元素的
* */
bool pop(int *n) {
if(isEmpty()) return false;
*n=array[tail];
tail=(tail+)%(capability+);
length--;
return true;
}
void showStack() {
int i=tail;
int temp=length;
printf("\nnew path\n");
while(temp>) {
printf("%d, ",array[i++]);
temp--;
}
}
};
class MinStack {
private:
MyStack *mainStack;
MyStack *assiStack;
int curMin;
public:
MinStack(): mainStack(new MyStack()),assiStack(new MyStack()),curMin() {}
/**
* 仅当出现新的最小元素时,才将前一个最小元素压入assiStack
* */
bool push(int n) {
if(mainStack->push(n)) {
if(n<curMin) {
assiStack->push(curMin);
curMin=n;
}
return true;
}
return false;
}
/**
* 仅当mianStack的pop元素等于curMin时,才从assiStack中新pop出一个元素
* */
bool pop(int *n) {
if(mainStack->pop(n)) {
if(*n == curMin) {
int *temp;
assiStack->pop(temp);
curMin=*temp;
}
return true;
}
return false;
}
int min() {
return curMin;
}
};
笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素的更多相关文章
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点
出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话, ...
- 笔试算法题(34):从数字序列中寻找仅出现一次的数字 & 最大公约数(GCD)问题
出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它 ...
- 笔试算法题(15):-1到N中包含1的数字的个数 & 连续和为N的序列
出题:输入一个整数N,求从1到N这N个整数的十进制表示中‘1’出现的次数: 分析: 从左向右处理string表示的数字:当前数字长度为n,判断最左边一位数字字符: 如果是0,则直接递归下一位: 如果是 ...
- 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...
- 笔试算法题(22):二分法求旋转数组最小值 & 骰子值概率
出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂 ...
- 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素
[python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...
- 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素2
[python]Leetcode每日一题-寻找旋转排序数组中的最小元素2 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...
- 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用
出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元 ...
随机推荐
- bzoj 4070: [Apio2015]雅加达的摩天楼【spfa】
明明是个最短路却有网络流一样的神建图= A = 首先要是暴力建图的话最坏有O(nm)条边.所以优化建图. 考虑分块思想,设bs=sqrt(n),对于p大于bs的,直接连边即可,最多有sqrt(n)条, ...
- [App Store Connect帮助]七、在 App Store 上发行(3.2)提交至“App 审核”:查看 App 状态历史记录
您可以查看您 App 的某一版本的 App 状态历史记录.在历史记录表中的每一行都包含 App 状态.App 状态更改时间,以及更改的发起人.使用此信息追踪“App 审核”流程中的 App. 若想在 ...
- sql server 查看版本
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'),SERVERPROPERTY ('edition') ...
- IE兼容之中文汉字请求乱码-network
IE兼容之中文汉字请求乱码 IE控制台报错: IE网络报错: 解决方法: encodeURI('--- @ -- 子卿 -'); // "---%20@%20--%20%E5%AD%90%E ...
- 面试基础试题 一 http和HTTPS的区别
作为老生常谈的问题,我主要给出我自己的理解和结合大牛的叙述的综合看法,来检验自己学习 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何 ...
- [POI2007]旅游景点atr
Description FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之 ...
- ACM二分查找模板
int main(){ == key int m; while ( l <= r ) { m = ( l + r ) >> 1; if ( x[m] == key ) return ...
- Environment中有大量访问目录的函数
public class Environment { /** * Return root of the "system" partition holding the core An ...
- XmlPullParser简单教程
官网: http://www.xmlpull.org 本文参考 : http://www.xmlpull.org/v1/download/unpacked/doc/quick_intro.html 1 ...
- iOS生成PDF的关键代码-备忘
//此方法只是把当前页面的内容生成PDF并保存在沙盒中. //还需要做:把当前面没有显示的内容以分页的形式生成PDF,并把PDF读取并显示出来 //关于显示可以参考:念茜的博客 iOS开发笔记——PD ...