========算 法=========
IvyYin
达则兼济天下
展开
-
二叉树系列二:二叉树的层序遍历(BFS)
二叉树的层次遍历是指从根节点开始,沿着树的宽度一层一层向下遍历,比如下图的二叉树,层次遍历的顺序为:A-B-C-D-E-F-G,那层次遍历如何实现呢?我们需要借助一个队列,由于队列是先进先出的,所以可以先让根入队,在根出队的同时打印根,并让根的左孩子入队,再让右孩子入队,这样一来,左孩子结点就存储在队头的位置,可以首先被访问;被访问之后,左孩子出队的同时打印左孩子,并让左孩子的孩子...原创 2017-10-19 15:33:03 · 10112 阅读 · 3 评论 -
插入排序
以下是插入排序的C语言实现,插入排序的思想是:若当前第i和第i-1相邻两个数据无序,则将第i个数据放入临时单元temp;将前面i-1个元素中大于temp的一一向后移动;将temp放入自己的位置#include<stdio.h>void InsertSort(int array[], int n){ int temp; for(int i = 1...原创 2017-09-25 11:47:42 · 164 阅读 · 0 评论 -
输出二叉树每一层的最右节点
题目含义如图: 解题思路:二叉树层次遍历,输出每一层的最后一个元素即可;参考层次遍历代码struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x): val(x), left(NULL), right(NULL) {}};vector<int&...原创 2018-08-25 16:02:47 · 4892 阅读 · 2 评论 -
顺时针打印矩阵(剑指offer20题)
顺时针打印矩阵,比如: 1 2 3 4 14 15 16 5 13 20 17 6 12 19 18 7 11 10 9 8 打印结果为 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20将问题分解成每次打印一圈,打印 n 圈来解决void printMatrix(vector<vec...原创 2018-04-27 11:35:32 · 156 阅读 · 0 评论 -
网易2018校招笔试编程题练习
#include<iostream>using namespace std;int main(){ int res; int n, x, f, d, p; while(cin >> x >> f >> d >> p) { if(f * x >= d) res ...原创 2018-08-10 23:29:45 · 319 阅读 · 0 评论 -
最长递增子序列的长度(编程之美)
题目描述:编程之美2.16中,求数组最长递增子序列的长度,例如数组为:1,-1,2,-3,4,-5,6,-7,那么最长递增序列是:1,2,4,6,长度是4.可以看出,子序列不一定是连续的解题思路:动态规划问题;使用 i 表示向前遍历的位置,当 i=1时,序列为 1,长度为1;当 i=2时,序列为 1 或者 -1,长度仍为1;当 i=3时, 序列为 1,2或者 -1,2,长...原创 2018-08-26 17:18:55 · 5552 阅读 · 0 评论 -
跳台阶
题目一:n阶台阶,每次只能跳2阶或者3阶,一共有多少种跳法? 分析:第n阶可以是第n-2阶跳2阶;第n阶可以是第n-3阶跳3阶;因此有 f(n) = f(n-2) + f(n-3)int jump(int n){ if(n < 2) return 0; if(n == 2) return 1; if(n == 3)...原创 2018-08-26 00:05:59 · 137 阅读 · 0 评论 -
不使用新的变量交换两个变量的值
解题思路:加减法异或都很简单,思路很新奇# 加减法def swap(a, b): a = a + b b = a - b a = a - b return a,b# 异或def swap(a, b): a = a ^ b b = a ^ b a = a ^ b return a, b...原创 2018-09-05 20:28:15 · 685 阅读 · 0 评论 -
蓄水池问题
题目描述: 给出一个数据流,这个数据流的长度很大或者未知,并且对该数据流中数据只能访问一次。请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等。 或者也可以这么说: 要求从N个元素中随机的抽取k个元素,其中N的大小未知。解题思路: 用到的方法为蓄水池抽样算法(reservoid sampling)。具体的思路是:先初始化一个集合,集合中有k个元素,将此集合作为蓄水池。然后...原创 2018-09-05 20:34:19 · 2535 阅读 · 0 评论 -
买n个苹果,一袋6个或者8个,求袋数最少时刚好买够n个?
题目描述:小易去买苹果,有两种包装,一种一袋8个,一种一袋6个,小易要买n个苹果(不能多也不能少),输出袋子最少的购买方案下的袋子,若无法正好买到n个,则输出-1。解题思路:如果要使袋子数最少,那么一定是尽量买8袋的,如果8袋不满足条件,逐步减少袋数,看6袋是否满足;int solution(int n){ int pack8 = n / 8; int pack6...原创 2018-09-14 15:28:21 · 1547 阅读 · 0 评论 -
二维数组查找某个数出现的次数
int solution(vector<vector<int>> A, int target){ if(A.size() == 0) return 0; int cols = A[0].size(); int rows = A.size(); int count = 0; int x = 0; int y ...原创 2018-09-14 17:30:33 · 2319 阅读 · 0 评论 -
两个有序数组求交集
假设两个数组 a 和 b,a 的长度为 m ,b 的长度为 n , m < n, 有以下四种解法:(1)每次从数组 b 中 取一个数,遍历 a 中所有元素进行比较,若相同就保存,这样时间复杂度为O(m*n); (2)由于数组是有序的,每次从数组 b 中 取一个数,对 a 中元素进行二分查找,若相同就保存,时间复杂度为O(nlog(m)); (3)将 a 中的元素 hash 存储(用...原创 2018-04-26 21:21:36 · 7117 阅读 · 3 评论 -
归并排序算法
归并排序是一种较为常用的排序算法,其时间复杂度最坏情况和平均情况均为nlgn,与快速排序相同,它也是一种基于分治思想的排序算法。 它的基本思路是把数组分成A、B两个组,如果这两组的数据是有序的,那么就可以对这两组数据进行合并,继而完成排序。 那么,最关键的问题就变成了如何使得A、B两组数据有序呢?归并排序的思想就是把A、B两组数据分别再分成两组,依次类推,直到小组数据只有一个的时候...原创 2017-08-02 10:25:00 · 359 阅读 · 0 评论 -
字符串的逆序
题目描述:将字符串逆序输出Python实现一:借助于列表的reverse()函数,需要注意的是,该函数没有返回值,只会让列表原地逆序借助于”“.join()函数,实现列表向字符串的转换def strReverse(s): lst = list(s) lst.reverse() ans = "".join(list(lst)) return a...原创 2017-10-12 10:09:51 · 392 阅读 · 0 评论 -
快速排序算法
面试中较为常见的算法之一就是快速排序,快速排序在实际排序应用中也是最好的选择,因为它的平均性能非常好,它的期望复杂度为nlgn,另外,它还是一种稳定的排序方法。快速排序利用分治思想,将待排序数组分成左右两个部分,然后对其分别递归调用快速排序算法。 下面通过一个例子介绍快速排序算法的思想,假设要对数组a[10]={6,1,2,7,9,3,4,5,10,8}进行排序,首先要在数组中选择一个数...原创 2017-08-01 22:06:00 · 14105 阅读 · 11 评论 -
二叉树系列一:二叉树的遍历
二叉树的遍历有先序、中序、后序三种遍历方式,下面一一介绍遍历算法并给出递归遍历的实现。1、定义二叉树结点的数据结构我们使用Node结构体定义二叉树的每一个节点,如下:typedef struct Node{ //数据 char data; //左孩子指针 struct Node *LChild; //右孩子指针 struct Nod...原创 2017-09-24 15:48:01 · 465 阅读 · 0 评论 -
二叉树系列三:二叉树的深度遍历(DFS)
二叉树的深度遍历和图的深度优先搜索很相似,遍历过程如下:先遍历根节点,然后从根节点的左孩子开始向下直到访问到叶子结点;当根的左子树访问完毕后,再访问右子树。如下图所示的二叉树,访问顺序为:A-B-D-E-C-F-GC++实现(20180421更新):/*struct TreeNode{ int val; TreeNode* left; TreeNode*...原创 2017-10-19 15:50:10 · 613 阅读 · 0 评论 -
二叉树系列四:判断二叉树是否为完全二叉树
满二叉树的定义如下:一个深度为k,结点个数为2^k-1的二叉树为满二叉树;完全二叉树的定义如下:二叉树只有最下层和次下层存在叶子结点,并且最下层的叶子结点只能集中在该层最左边的位置,显然,满二叉树也是完全二叉树。 那该如何判断一棵二叉树是否为完全二叉树呢?任意一棵二叉树,我们可以将它补成满二叉树,这样,没有结点的地方都为null。在层次遍历的时候,如果是完全二叉树,这些null结点一定在...原创 2017-10-19 21:23:00 · 961 阅读 · 0 评论 -
二叉树系列五:求二叉树的宽度
二叉树的宽度是指二叉树各层结点个数的最大值。求二叉树的宽度可以依据与二叉树的层次遍历,我们知道,二叉树的层次遍历借助于deque实现,每次打印当前结点后将其左子树右子树入队,此时队列中既包含当前层的结点,也包含下一层的结点,若我们将当前层的结点全部出队,剩余的就是下一层的结点个数。所以,我们可以使用maxWidth来表示最大宽度,若下一层的结点个数大于maxWidth,则更新maxWidth,...原创 2017-10-19 21:47:02 · 22731 阅读 · 4 评论 -
二叉树系列六:求二叉树叶子结点间的最大距离 [编程之美]
题目描述: 如果把二叉树看作图,父子结点间的连线是双向的,我们姑且定义“距离”为两个结点之间边的个数,如下图所示,相距最远的两个结点是A和B,距离为6。写程序实现二叉树中相距最远的两个结点之间的距离。思路分析: 计算一棵二叉树的最大距离有两种情况,第一种是路径经过左子树的最深结点,通过根节点,再到右子树的最深结点,那么距离就是左右子树的深度和;另一种情况是,路径不穿过根节点,只...原创 2017-10-20 09:47:10 · 1556 阅读 · 0 评论 -
堆排序
堆分为最大堆和最小堆,最大堆要求根节点不小于它的子节点,最小堆要求根节点不大于它的子节点。 以从大到小排序为例,先要建一个最大堆,那么这个堆的根节点一定是最大的, 让堆的根节点和最后一个元素交换位置,然后把剩余的元素调整为最大堆,以此类推,最后得到有序序列。//调整为最大堆void Adjust(int a[], int i, int n){ int j = 2 * i + 1...原创 2018-04-26 19:46:41 · 127 阅读 · 0 评论 -
atoi:char类型转换成int类型
C++中有函数atoi()可以实现char类型与int类型的转换,我们也可以使用char类型减去’0’的方法得到int型数值的某一位,然后根据其所在位置(个、十、百….)求得数据的int型表示。 如有需要,请访问我的Github获取包含测试程序的C++源码。 1、使用atoi()函数实现class Solution{public: int myAtoi(char...原创 2017-08-31 21:25:53 · 8679 阅读 · 0 评论 -
itoa:int型整数转换成字符串
C/C++中有函数itoa()来实现int型与字符串的转换,我们也可以使用整数加‘0’的方法,整数加‘0’会隐式地转换成char类型。如有需要,请访问我的Github获取包含测试程序的C++源码。 1、使用itoa()函数的实现如下:class Solution{public: void my_itoa(int x) { char str[...原创 2017-08-31 20:49:49 · 1180 阅读 · 0 评论 -
求字符串最长不重复子串的长度
题目描述:给定一个字符串,返回该字符串最长不重复子串的长度解题思路: python实现def lenOfLongestSubstring(self, s): if len(s) == 0: return 0 ret = 0 #返回的长度 dic = {} temp = 0 start = 0 for i in range(l...原创 2018-04-26 19:55:45 · 452 阅读 · 0 评论 -
牛客网练习题(网易)
1、[编程题] 魔法币时间限制:1秒 空间限制:32768K小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币小易采购魔法神器总共...原创 2018-03-27 17:13:09 · 751 阅读 · 0 评论