出题:输入一个已经升序排序的数组和一个数字;要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n);

分析:对于升序排序的数组{…i…j…k…m……},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情况;

解题:

 void FindSumFactor(int *array, int length, int sum) {
int left=, right=length-;
while(true) {
/**
* 如果当前和比sum小,则left往右移动;
* 如果当前和比sum大,则right往左移动
* 由于每次仅有一个指针移动,所以left和right必定会重合
* 所以不用担心数组溢出问题
* */
if(array[left]+array[right]<sum) {
left++;
} else if(array[left]+array[right]>sum) {
right--;
} /**
* 每一次都单独判断是否相等,这样可以处理left和right
* 重叠,但是他们的和等于sum的情况
* */
if(array[left]+array[right]==sum) {
printf("\nthe sum factors are: %d, %d\n",
array[left],array[right]);
exit();
} if(left>=right) {
printf("\nfail to find the sum factor\n");
exit();
}
}
}

出题:输入一棵二元查找树,要求使用递归和循环两种方式实现镜像树的生成,也就是新树中的左子树节点大于右子树节点;

分析:单源递归可以不用辅助结构就可以实现循环;多源递归(DFS和BFS)需要使用辅助结构实现循环;

解题:

 /**
* 将当前current的左右子树交换,然后对左右子树递归调用本方法
* 最后返回当前节点到上层树。注意当子树为NULL时候对应子树的
* 设置
* */
Node* RecursiveMirrorTree(Node *current) {
Node *temp=current->left;
if(current->right != NULL) {
current->left=RecursiveMirrorTree(current->right);
} else
/**
* 此处一定需要注意,如果不改变的话则发生错误
* */
current->left=NULL; if(temp != NULL) {
current->right=RecursiveMirrorTree(temp);
} else
current->right=NULL; return current;
}
/**
* 对于单源递归(仅一处发生递归),普通循环就可以解决;对于多源递归
* (多处发生递归,如左右子树),则必须使用辅助数据结构,或者stack
* 或者queue
* */
void NonRecursiveMirrorTree(Node *root) {
MyStack *stack=new MyStack();
stack->push(root);
Node *temp, *current;
while(!stack->isEmpty()) {
current=stack->pop();
temp=current->left; if(current->right != NULL) {
current->left=current->right;
stack->push(current->right);
} else
current->left=NULL; if(temp != NULL) {
current->right=temp;
stack->push(temp);
} else
current->right=NULL;
}
delete stack;
}

笔试算法题(09):查找指定和值的两个数 & 构造BST镜像树的更多相关文章

  1. 笔试算法题(03):最小第K个数 & 判定BST后序序列

    出题:输入N个整数,要求输出其中最小的K个数: 分析: 快速排序和最小堆都可以解决最小(大)K个数的问题(时间复杂度为O(NlogN)):另外可以建立大小为K的最大堆,将前K个数不断插入最大堆,对于之 ...

  2. 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用

    出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元 ...

  3. 【Data Structure & Algorithm】在排序数组中查找和为定值的两个数

    在排序数组中查找和为定值的两个数 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出 ...

  4. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  5. 笔试算法题(38):并查集(Union-Find Sets)

    议题:并查集(Union-Find Sets) 分析: 一种树型数据结构,用于处理不相交集合(Disjoint Sets)的合并以及查询:一开始让所有元素独立成树,也就是只有根节点的树:然后根据需要将 ...

  6. 笔试算法题(42):线段树(区间树,Interval Tree)

    议题:线段树(Interval Tree) 分析: 线段树是一种二叉搜索树,将一个大区间划分成单元区间,每个单元区间对应一个叶子节点:内部节点对应部分区间,如对于一个内部节点[a, b]而言,其左子节 ...

  7. 算法笔记_037:寻找和为定值的两个数(Java)

    目录 1 问题描述 2 解决方案 2.1 排序夹逼法   1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即 ...

  8. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  9. 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

    议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排 ...

随机推荐

  1. 软件项目功能测试框架(转载自51Testing软件测试)

    测试用例的编写需要按照一定的思路进行,而不是想到哪写到哪,一般测试机制成熟的公司都会有公司自己自定义的测试用例模板,以及一整套的测试流程关注点,当然我们自己在测试生涯中也应当积累一套自己的测试框架,所 ...

  2. PHP中foreach有关引用的问题

    软件开发的过程中,细节处理非常重要,说得大一点就是细节决定成败,别人不懂的地方,你懂,别人没注意到的细节,你注意到了,这就是你胜出对方的地方,这样就体现出了你的价值. 下面是几个foreach循环中引 ...

  3. 码云 fatal: Authentication failed for

    最近push代码到码云时,push失败,提示fatal: Authentication failed for,解决方法就是: 在git命令行中输入 git config --system --unse ...

  4. 第四篇(那些JAVA程序BUG中的常见单词)

    xxx cannot be resolved to a variable xxx无法解析为变量 resolve 解析

  5. 图论算法->最短路

    求最短路算法,有Floyd,dijkstra,Bellmanford,spfa等诸多高级算法.优化方法也是层出不穷. 我们不妨分析一下各算法的使用特点(可能不准确 1.Floyd算法 复杂度O(n³) ...

  6. js实现打字效果

    <!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>js typing& ...

  7. BZOJ2159 Crash的文明世界

    Description 传送门 给你一个n个点的树,边权为1. 对于每个点u, 求:\(\sum_{i = 1}^{n} distance(u, i)^{k}\) $ n \leq 50000, k ...

  8. (三)python函数式编程

    一.高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 结论:函数本身也可以赋值给变量,即:变量可以指向函数 ...

  9. Tree Recovery POJ - 2255

    Tree Recovery POJ - 2255 根据树的前序遍历和中序遍历还原后序遍历. (偷懒用了stl的find) #include<iostream> #include<st ...

  10. 209 Minimum Size Subarray Sum 大于给定和最短子数组

    给定一个含有 n 个正整数的数组和一个正整数 s , 找到一个最小的连续子数组的长度,使得这个子数组的数字和 ≥  s .如果不存在符合条件的子数组,返回 0.举个例子,给定数组 [2,3,1,2,4 ...