数据结构与算法分析
文章平均质量分 50
NearXDU
西电三系小硕,互联网爱好者。
展开
-
不使用中间变量交换整型数据的值
思想就是通过简单的加减运算凑出最终的值。代码:#include using namespace std;int main(){ int a = 1; int b = 4; cout << "before swap" << endl; cout <<"a= " << a<< endl; cout <<"b= " << b<<原创 2015-03-10 10:14:21 · 848 阅读 · 0 评论 -
LRUCache的设计与实现C++
LRU Cache的设计与实现。原创 2016-10-30 21:03:12 · 5511 阅读 · 0 评论 -
单链表
单链表原创 2017-02-05 18:17:59 · 491 阅读 · 0 评论 -
栈的应用之最长匹配括号长度
最长匹配括号长度主要介绍栈的一个应用,之前做过类似的题目,这次彻底搞懂,记录之。。找到最长匹配括号长度,这题比较难,之前刷题的时候就觉得,这次学到了。 比如说()()()(((最长匹配括号长度为6,((())最长匹配括号长度是4。 1.如果是左括号肯定是压栈(压入该左括号在串中的索引)。 2.如果是右括号: 那么就要分两种情况: 第一种情况是栈不为空,说明找到了匹配的左括号,原创 2017-02-05 18:22:09 · 710 阅读 · 0 评论 -
字符串应用之最长公共子序列和最长公共子串
最长公共子串和最长公共子序列原创 2017-02-05 18:26:44 · 637 阅读 · 0 评论 -
字符串应用之最长上升字序列LIS
用LCS解决LIS问题最长上升子序列有它的套路,不过用LCS算法是可以解决的: 假设原序列为AA 第一步:现在对原序列进行排序得到排序后的序列BB 第二步:考虑原序列AA可能有重复元素,对序列BB还要进行去重得到序列B′B^{'} 第三步:对AA和B′B^{'}做LCS运算,即可得出原序列AA的LIS最长上升子序列。好,这个算法在LeetCode是Memory Limit代码class So原创 2017-02-06 13:00:51 · 1014 阅读 · 0 评论 -
字符串应用之全排列
之前在leetcode做过全排列的题目,LeetCode46和LeetCode47分别是不带重复元素和带重复元素的全排列,当时图个简单,直接用STL的next_permutation去做了,这一次把递归算法学习了一遍。不重复元素的全排列对于1234….n这样的全排列,他的全排列有n!n!种,因此求解该问题的时间复杂度为n!n!。其实要求全排列,无非就是对元素进行交换,使他们出现在不同的位置。代码cl原创 2017-02-06 14:53:23 · 549 阅读 · 0 评论 -
字符串应用之最长回文串
以前做过一个方法就是从中间往两头扩展。manacher算法是对这种算法的优化。比如字符串是FGFXXAXXFGF,在以A为中心的回文串中,还包含FGF这样回文串,那么当我们计算右边的FGF时,可以利用左边FGF的信息,因为他们是对称的,这就是Manacher算法的思想。另外考虑奇数和偶数的不同情况,预先对字符串进行预处理,每隔一个字符插入一个“#”,那么原字符假如是ABA将变成#A#B#A#,原字符原创 2017-02-07 12:43:40 · 752 阅读 · 0 评论 -
Eratosthenes筛选法求小于N的所有素数个数
Eratosthenes筛选法求小于N的所有素数个数原创 2017-02-09 00:05:06 · 2457 阅读 · 0 评论 -
Polya问题
Polya问题给定红色和蓝色给八个棋子涂色,求所有的涂色方案,其中某种方案可以通过旋转到另一种,则这两种方案视作一种。研一组合数学讲的波利亚定义,旋转轮换的内容。如果用代码解决,可以将八个棋子视作二进制的8位。那么如果不考虑条件所说的旋转算一做,那理论上有255种不同的方案。同样是筛选法的思想,假设现在一共255种方案,那么遍历这些方案,对某种方案循环左移8次(8次后肯定会回到相同的位置),循环左移原创 2017-02-09 00:06:11 · 623 阅读 · 0 评论 -
整数次幂的递归求解
整数次幂一般解法时间复杂度O(n)O(n)的方法可以迭代n次,然后相乘结果返回,例如求xnx^n伪代码:double pow(x,n){ res=x; while(n--) res*=x; return res; }递归法使用递归的方法可以将复杂度降低到O(logn)O(logn) 思路是比如一个数的8次幂,可以看成4次幂乘4次幂,进而分成原创 2017-02-09 00:07:31 · 3716 阅读 · 1 评论 -
选择绝对众数
绝对众数的概念表示序列中的唯一众数,且出现的次数大于N2\frac{N}{2},NN表示序列的长度。 实际上在序列中如果某个数的出现次数超过该序列长度的一半,那么该数一定是唯一的众数。解决这个问题的办法有多: 1.排序,时间复杂度为O(nlogn)O(nlogn),返回nums[N/2]。 2.使用hash,时间复杂度可以降低到O(n)O(n),但需要额外的空间复杂度。有更好的办法,O(n)O原创 2017-02-12 16:00:01 · 684 阅读 · 0 评论 -
二分查找
二分查找是既简单又困难的部分,如果序列有序,我们可以使用二分查找,总结如下:一、递归的二分查找递归的方法来解决二分查找。int bsearch(vector<int>&nums,int low,int high,int target){ if(low>high) return -1; int mid=(low+high)/2; if(nums[mid]>ta原创 2017-02-12 18:20:17 · 698 阅读 · 0 评论 -
求局部峰值
在序列中如果一个数比其左右两边都要大,那么称之为局部峰值,一个序列中可能有一个或者多个局部峰值,找出其中一个。比较简单的办法是从0开始迭代,这样的时间复杂度是O(n)O(n),我们知道二分查找的复杂度是O(logn)O(logn),因此考虑用二分的思路来做。class Solution {public: int findPeakElement(vector<int>& nums) {原创 2017-02-12 20:38:02 · 2270 阅读 · 1 评论 -
第一个没有出现的正整数
题目描述在一个数组中,找出从1~n 第一个没有出现的正整数,n是数组容量。分析这个题目是有多种解法:一、暴力求解从1~n每次迭代搜索,复杂度为O(n2)O(n^2)二、排序先排好序列再用二分,复杂度可以降低到O(nlogn)O(nlogn)三、哈希申请额外的空间,大小为n,表示1~n个正整数。遍历原数组,把出现的且在1~n范围的数的索引设为true,也就是hash[nums[i]]=true,且1<原创 2017-02-12 22:10:27 · 1176 阅读 · 0 评论 -
旋转数组求最小值
旋转数组的概念就是对有序数组循环向右移动K位得到的数组。 例如[1,2,3,4,5]经过右移2位后旋转后得到:[4,5,1,2,3]一、如何得到旋转数组比如说现在要求旋转右移K位,求移动后的结果。第一步要对K进行处理,因为假设原数组是[1,2,3]: 当K=1,旋转数组为[3,1,2] 当K=2,旋转数组为[2,3,1] 当K=3,旋转数组为[1,2,3] 当K=4,旋转数组为[3,1,原创 2017-02-14 16:44:14 · 2126 阅读 · 0 评论 -
最接近0的数组子序列
给定一个数组,在数组中找一段子序列,要求子序列的和最接近0。 例如: 输入:[-3, 1, 1, -3, 5], [0, 2], [1, 3], [1, 1], [2, 2] ,[0, 4]都是可行解sum[i,j]表示[i,j]索引的所有元素的和。 sum[i,j]可以换算成下面公式: sum[i,j]=sum[0,j]-sum[0,i] + num[i]这里为了方便起见,在写代码时原创 2017-02-14 20:27:39 · 1117 阅读 · 0 评论 -
二叉树的遍历 C++模板+封装
C++ 二叉树遍历 模板+封装原创 2016-10-04 17:28:11 · 1842 阅读 · 0 评论 -
计数排序实现基数排序
计数排序来实现基数排序原创 2016-04-15 10:14:11 · 1819 阅读 · 0 评论 -
从字串的单词倒序算法到C#字串处理
年前秋招,代舍友笔试的一道题:“输入字串,字串由单词和空格组成,将字串按单词倒序”例如:输入:hello world输出:world hello思路就是,先将整个字串倒序,再将字串按单词倒序打印。代码如下:#include using namespace std;#define MAX_STRING_LENGTH 256string strOrigin;char原创 2015-03-17 09:12:20 · 1277 阅读 · 0 评论 -
编程找出不同的四位平方数对,它们由相同的数字构成
问题重述:[ 1024,2401; 1089,9801; 1296,2916; 1296,9216; 1369,1936; 1764,4761; 2916,9216; 4096,9604 ] 上述数对是1000~9999 的平方数,他们4个位数上所用到的数字是一样的。问题分析:1000~9999所有的平方数对应的平方根范围是32~99,二重遍历32~99,找出符合规则的数对{x,y原创 2015-03-11 20:44:12 · 2273 阅读 · 0 评论 -
把1分解为若干个互不相同的单位分数之和
深度优先搜索,自己尝试写的代码输出总是有点问题,网上找到大神写的代码,研读了2个小时,真的十分精妙,在此加上注释分享问题重述:形如:1/a 的分数称为单位分数。可以把1分解为若干个互不相同的单位分数之和。例如:1 = 1/2 + 1/3 + 1/9 + 1/181 = 1/2 + 1/3 + 1/10 + 1/151 = 1/3 + 1/5 + 1/7 + 1/9原创 2015-03-13 16:26:54 · 5304 阅读 · 1 评论 -
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
题目描述:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。输入:输入可能包含多个测试样例。对于每个测试案例,输入为一个整数n(1输出:对应每个测试案例,输出1+2+3+…+n的值。简单的递归,网上有利用C++构原创 2015-04-10 19:29:54 · 1632 阅读 · 1 评论 -
栈的压入、弹出序列
依然是舍友春招的笔试题之一。题目重述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。输入:每个测试案例包括3行:第一行为1个整数n(1第二行包含原创 2015-04-10 16:15:34 · 566 阅读 · 0 评论 -
最小邮票数(九度1209)
据说是清华07年的研究生复试机试题,类似01背包,动态规划一直不太会,这道题不难,刚好可以练练手。题目描述: 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。输入: 有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M输出:原创 2015-04-18 15:17:09 · 835 阅读 · 0 评论 -
二维数组查找
天气变化大,生病折腾了1个礼拜,写篇博客压压惊。题目源自于清明假期前夕舍友春招的笔试题,后来得知是剑指offer上的一道题,书上应该有解题思路啥的。题目重述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。由于从左到右,从上到下是递增的。如果从索引[0,0原创 2015-04-09 16:11:36 · 725 阅读 · 0 评论 -
动态规划最大子序列和(九度1077)
练习动态规划动态规划方程:dp[i] = max {dp[i-1] + value[i] , value[i]}代码:#include using namespace std;int M;long long value[1000001]={0};long long dp[1000001]={0};//dp[i] = max {dp[i-1] + value[i] , v原创 2015-04-29 16:31:07 · 1055 阅读 · 0 评论 -
C++模板插入排序
插入排序的C++模板实现原创 2016-03-07 20:19:17 · 1253 阅读 · 0 评论 -
C++模板归并排序
C++模板实现归并排序原创 2016-03-07 20:44:20 · 1128 阅读 · 0 评论 -
【数据结构与算法】二叉树递归与非递归遍历(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/12977901二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来转载 2016-03-12 11:06:16 · 660 阅读 · 0 评论 -
【数据结构与算法】二叉树的层序遍历
转载请注明出处: http://blog.csdn.net/ns_code/article/details/13169703 前面有篇博客详细分析了二叉树三种遍历(前序、中序、后序)方式的递归与非递归实现,参见:http://blog.csdn.net/ns_code/article/details/12977901,但把二叉树的层序遍历算法给漏掉了,实际上也不能说漏掉了转载 2016-03-12 11:08:58 · 5235 阅读 · 0 评论 -
单链表的逆置-C++实现
原文:http://blog.csdn.net/heyabo/article/details/7610732对于单链表的逆置有两种方法可以实现:(1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。 实现代码:[cpp]转载 2016-02-29 09:49:36 · 2321 阅读 · 0 评论 -
C++模板计数排序
C++模板计数排序简介原创 2016-04-06 20:50:47 · 1437 阅读 · 0 评论 -
C++模板堆排序
堆排序简介堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。原创 2016-03-27 15:28:23 · 2121 阅读 · 0 评论 -
C++模板快速排序和Stooge排序
快速排序和Stooge排序原创 2016-03-29 11:26:21 · 835 阅读 · 0 评论 -
C++实现一个堆(模板)
C++ 实现一个堆原创 2017-05-18 11:41:00 · 3162 阅读 · 0 评论