出题:输入一个已经升序排序的数组和一个数字;要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是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. DateTime?转化为DateTime,int? 转 int

    深入理解C#---1.可空类型 https://blog.csdn.net/tianzeyu1992/article/details/52618131 原文:https://blog.csdn.net ...

  2. 字符串常量是String类的匿名对象

    String str = "Hello"; System.out.println(str.equals("Hello"));//true,字符串对象调用equa ...

  3. bzoj 2792: [Poi2012]Well【二分+贪心】

    #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const ...

  4. bzoj 1602: [Usaco2008 Oct]牧场行走【瞎搞】

    本来想爆手速写个树剖,然而快下课了就手残写了了个n方的短小-- 暴力把查询的两个点中深的一个跳上来,加上边权,然后一起跳加边权就行了 #include<iostream> #include ...

  5. git 文件回滚

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file.场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第 ...

  6. jenkins构建maven项目

    使用jenkins构建部署maven项目 因为一开始我们是自定义插件,所以构建项目的时候没有显示maven风格的项目.如果要想使用maven,我们这里必须得安装一下插件,我们在插件管理器中, 可以看到 ...

  7. C++入门知识点总结

    阅读目录 1 C++中的命名空间 C++中使用命名空间来解决在相同文件或范围的同名变量问题,示例程序如下: #include <iostream> using namespace std; ...

  8. [POI2009]Kon

    Description 火车沿途有N个车站,告诉你从每一站到每一站的人数,现在查票员只能查K次票,每次查票可以控制目前在车上的所有乘客的车票.求一个查票方案,使得控制的不同的乘客尽量多. (显然对同一 ...

  9. 二分查找/暴力 Codeforces Round #166 (Div. 2) B. Prime Matrix

    题目传送门 /* 二分查找/暴力:先埃氏筛选预处理,然后暴力对于每一行每一列的不是素数的二分查找最近的素数,更新最小值 */ #include <cstdio> #include < ...

  10. C#中如何判断键盘按键和组合键

    好记性不如烂笔头子,现在记录下来,不一定会有很详尽的实例,只写最核心的部分. C# winform的窗体类有KeyPreview属性,可以接收窗体内控件的键盘事件注册.窗体和控件都有KeyDown,K ...