
Algorithms
林雪娇
细心浇灌,静等花开。
展开
-
两个栈实现一个队列
class Solution{public: void push(int node) { stack1.push(node); } int pop() { int a; if(stack2.empty()) { while(!stack1.empty()) {...原创 2018-04-24 14:58:59 · 411 阅读 · 0 评论 -
包含min函数的栈
class Solution {public: stack<int> data; stack<int> mindata;//辅助栈,用来存放栈中最小的数据 void push(int value) { data.push(value); if(mindata.empty()) { ...原创 2018-04-24 19:04:24 · 9446 阅读 · 0 评论 -
重建二叉树
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Soluti...原创 2018-05-09 11:17:18 · 150 阅读 · 0 评论 -
顺时针打印矩阵
class Solution {public: vector<int> printMatrix(vector<vector<int> > matrix) { int row = matrix.size(); int col = matrix[原创 2018-05-09 14:40:55 · 141 阅读 · 0 评论 -
从上到下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }...原创 2018-05-09 15:05:42 · 175 阅读 · 0 评论 -
数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。分析:拿到此题目的时候我们首先考虑的就是各种边际条件,此题主要靠我们的也是边界条件的处理,对于边界条件的考虑,我们主要考虑: (1)base是否为0,在为0的时候exponent是否为小于0 ...原创 2018-04-24 23:14:31 · 389 阅读 · 0 评论 -
旋转数组中的最小数字(多种方法)
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。第一种方法:时间复杂度为nlog(n) 先进行排序,然后取出排序数组的第一个元素 代码如下:class Sol...原创 2018-04-25 13:01:58 · 899 阅读 · 0 评论 -
对称二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析:对于一棵二叉树,我们首先从根节点开始遍历(1)如果左右子树有一个为空,那么该二叉树肯定不是对称二叉树(2)如果左右子树均不为空,但是节点的值不同,那么该二叉树肯定不是对称二叉树(3)如果左右子树均不空,且对应的节点值相同,那么: (1)遍历左子树,遍历顺序为...原创 2018-04-25 16:28:53 · 1256 阅读 · 0 评论 -
翻转单词顺序列
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?分析:首先我们将整个字符串...原创 2018-04-25 16:48:50 · 369 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路本题找出数组中两个只出现一次的数字我们应该分三步进行查找 (1)首先对数组中的所有元素异或,则得到只出现一次的两个数的异或结果 (2)找出这两个数异或的结果中从右边第一位为1的位(这里我们采用x&=(-x))其中-x=~x+1利用这个公式则最右边只有一位为1,其余的都...原创 2018-05-11 10:07:30 · 177 阅读 · 0 评论 -
KMP算 法
字符串匹配举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。 1. 首先,字符串”BBC ABCDAB ABCDABCDABDE”的第...原创 2018-05-07 14:29:43 · 480 阅读 · 0 评论 -
常用的排序算法总结
2018年5月7日上午十点整,本宝宝决定从头开始复习,每天一半的时间复习基础知识,一半的时间做项目(多实践)看了第一本大话数据结构,以后想把每一本书比较重要的知识点总结一下。 排序算法的稳定性:假设Ki=Kj (1&lt;=i&lt;=n,1&lt;=j&lt;=n,i!=j),且在排序前的序列中ri领先于rj,如果排序后ri仍领先rj,则称所用的排序是稳定的,如果改变了,就不是稳定的。1...原创 2018-05-08 10:41:44 · 5102 阅读 · 2 评论 -
单链表的快速排序
单链表的特点是:单向。设头结点位head,则最后一个节点的next指向NULL。如果只知道头结点head,请问怎么将该链表排序? 设结点结构为 [cpp] view plain copy print?struct&amp;amp;nbsp;Node{&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&am转载 2018-06-06 10:46:22 · 341 阅读 · 0 评论 -
链表反转
如何把一个单链表进行反转?方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。方法2:使用3个指针遍历单链表,逐个链接点进行反转。方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。方法4: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单...转载 2018-06-09 09:48:21 · 293 阅读 · 0 评论 -
二叉搜索树转换成双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路中序遍历:把一棵二叉排序树看成三个部分,根节点,右子树,左子树,根节点的左指针指向左子树的形成链表的最后一个节点,根节点的右孩子指向右子树形成链表的第一个节点,再对左右递归进行上述操作。图形表示代码展示public class Sol...原创 2018-07-16 15:19:29 · 938 阅读 · 0 评论 -
整数中1出现的次数 (1到n中1出现的次数)
题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。代码如下所示:class Solution {public: int sum_1(int k) ...原创 2018-04-24 16:53:45 · 349 阅读 · 0 评论 -
连续子数组的最大和
题目:给定一个数组,数组里面有正数,也有负数,求其连续数组的和的最大值。例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。本题的主要思路是:首先我们看一下当前值的之前的和cursum的值是否小于等于0,如果cursum小于等于0,那么我们就令cursum=当前值(array[i]),如果cursum大于等于0,则cursum+=当前值(arra...原创 2018-04-24 16:34:53 · 455 阅读 · 0 评论 -
大端小端的判断
字节序是指大端小端用来描述多字节数据在内存中存放的顺序;大端字节序是指最高有效位存放最低内存地址;小端字节序是指最高有效位存放最高内存地址;主机字节序是指不同CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序;不同的主机有不同的字节序,X86一般采用的是小端字节序,网络字节序规定是大端字节序下面是判断系统是大端小端的代码:#include<iostream>using na...原创 2018-04-16 14:20:15 · 5120 阅读 · 0 评论 -
求1+2+3+4+...+n
问题:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。int sum_solution(int n){int sum=n;bool k=((n>0)&&(sum+=sum_solution(n-1))>0);return sum;}...原创 2018-04-24 14:29:30 · 1292 阅读 · 0 评论 -
构建乘积数组
vector<int> multiply(const vector<int>& A) { vector<int> vec; int sz=A.size(); if(sz==0) return vec; vec.push_back(1); ...原创 2018-04-24 14:15:15 · 410 阅读 · 0 评论 -
二叉树的镜像
求二叉树镜像的主要思想是:首先判断根节点是否为空,以及根节点是否有左子节点和右子节点,如果两个子节点都没有则返回,如果有,那么我们就要先交换两个子节点,然后在分别分析以根节点的左子节点为根节点的左子树,分析以根节点的右子树为根节点的右子树。二叉树的定义有三项,分别是值域,指向左孩子的指针left,指向右孩子的指针right,根据这些我们可以给出二叉树的定义:struct TreeNode { ...原创 2018-04-24 11:35:30 · 421 阅读 · 0 评论 -
不用加减乘除做加法
int addsum(int a,int b){int one=0;//保存不进位值 异或运算的结果int two=0;//保存进位的值 进行与运算,然后左移一位do{one=a^b;two=(a&b)<<1;a=one;b=two;}while(two!=0);return one;}...原创 2018-04-24 10:31:31 · 376 阅读 · 0 评论 -
交换两个数的值
交换两个数的值有很多方法,我在这里主要提供3种方法:(1)最基本的方法 void swap(int a,int b){int temp=a;a=b;b=temp;}(2) 基于加减法的交换void swap(int a,int b){a=a+b;b=a-b;a=a-b;a=b;b=temp;}(3) 基于异或的方法void swap(int a,int...原创 2018-04-24 10:21:20 · 497 阅读 · 0 评论 -
两个链表的第一个公共节点
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1==NULL||pHead2==NULL) return NULL; ListNode* node1=pHead1; ListNode* node2=pHead2; ...原创 2018-04-22 11:46:04 · 374 阅读 · 0 评论 -
数字在有序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数分析:如果是有序数组或者有的时候提到log n,此时我们一定要想到二分查找,使用二分查找的效率很高,查找的时间复杂度为O(log n)代码如下所示:int search_times(vector<int> res,int k){int start=0;int end=res.size()-1;int index=-1;//首先查找...原创 2018-04-22 11:16:55 · 785 阅读 · 0 评论 -
删除链表中重复的节点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5分析:(1)要想删除链表重复的节点,我们必须设置两个指针,一个是指向重复节点前面指针,一个是只想当前重复节点的指针,如果遇到相等的节点,那么我们就要将相等节点前面节点的指针指...原创 2018-04-21 22:58:34 · 387 阅读 · 0 评论 -
链表环的入口节点
(1)首先我们利用快慢指针,来判断链表是否有环,如果链表有环,则快慢指针会相遇(2)当快慢指针相遇时,我们设:环外部长度为x,环的长度为n,慢指针在环中所走的路径长度为k,因为快指针走的速度是满指针的二倍,所以2*(x+k)=x+m*n,其中m指的是快指针在环中走了m圈,则求出x=m*n-k,慢指针再走n-k步到达环的入口处,当m为1时,则x=n-k,让快指针从头开始走,每次只走一步,慢指针在相交...原创 2018-04-21 21:44:34 · 682 阅读 · 0 评论 -
合并有序的两个链表(非递归写法)
ListNode* hebing_twolist(ListNode* head1,ListNode* head2){if(head1==NULL&&head2==NULL)return NULL;if(head1==NULL)return head2;if(head2==NULL)return head1;ListNode* tail=NULL;...原创 2018-04-21 17:01:47 · 4746 阅读 · 0 评论 -
合并有序的两个链表(递归写法)
ListNode* hebing_twolist(ListNode* head1,ListNode* head2){if(head1==NULL&&head2==NULL)return NULL;if(head1==NULL)reurn head2;if(head2==NULL)return head1;ListNode*head=NULL;if...原创 2018-04-21 16:24:15 · 4871 阅读 · 0 评论 -
链表中倒数第K个节点
ListNode* lianbiao_k(ListNode * head,unsigned int k){ if(head==NULL||k==0) return NULL; ListNode* first=head; ListNode* second=head; for(int i=1;i<k;i++) { ...原创 2018-04-21 15:12:45 · 4709 阅读 · 0 评论 -
atoi函数
int atoi(char *str){ assert(str != NULL);//处理空指针 assert(strlen(str) != 0);//处理空字符串 int sign = 1; int index = 0; while (str[index] == ' ') index++;//处理首部为空 if (str[index] == '-') { sign = -...原创 2018-04-16 14:40:39 · 4746 阅读 · 0 评论 -
链表的反转
listnode reverse(listnode head){if (head == NULL)return head;listnode p, q, pre;p = head->next;q = NULL;head->next == NULL;while (p){pre = p->next;p->next = q;q = p;p = pre;}...原创 2018-04-16 14:28:21 · 4711 阅读 · 0 评论 -
树的最长路径
问题描述:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义”距离”为两节点之间边的个数。 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。测试用的树: &n原创 2018-08-09 09:38:33 · 2219 阅读 · 0 评论