随笔分类 - 算法与数据结构
摘要:一个n*m的网格,求这个网格中矩形的数目。 比如以下2*2网格,总共有9个矩形:4个1*1的矩形,4个1*2的矩形,1个2*2的矩形 算法1:动态规划,假设dp[i][j]表示以第 i 行第 j 列的格子为右下角顶点的矩形数目,那么dp[i][j] = 1 + dp[i-1][j] + dp[i][j-1] – dp[i-1][j-1] , 这里的1表示i ,j 位置的格子自身构成1...
阅读全文
摘要:比如对于数组[1,-2,3,5,-1,2] 最大子数组和是sum[3,5,-1,2] = 9, 我们要求函数输出子数组和的最大值,并且返回子数组的左右边界(下面函数的left和right参数).本文我们规定当数组中所有数都小于0时,返回数组中最大的数(也可以规定返回0,只要让以下代码中maxsum初...
阅读全文
摘要:求数组全排列(不包含或者包含重复元素) 求数组所有组合(相当于求集合的所有子集,不包含或者包含重复元素) 从n个数中选择k个的组合(不包含重复元素) 从n个数中选择k个的组合(包含重复元素) 【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3695472.html
阅读全文
摘要:LeetCode:Combinations这篇博客中给出了不包含重复元素求组合的5种解法。我们在这些解法的基础上修改以支持包含重复元素的情况。对于这种情况,首先肯定要对数组排序,以下不再强调修改算法1:按照求包含重复元素集合子集的方法LeetCode:Subsets II算法1的解释,我们知道:若当...
阅读全文
摘要:Search Insert PositionGiven a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if ...
阅读全文
摘要:题目链接Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique lo...
阅读全文
摘要:这篇文章分析一下链表的各种排序方法。以下排序算法的正确性都可以在LeetCode的链表排序这一题检测。本文用到的链表结构如下(排序算法都是传入链表头指针作为参数,返回排序后的头指针)struct ListNode { int val; ListNode *next; ListNode(int x) ...
阅读全文
摘要:这里不详细说明快速排序的原理,具体可参考here快速排序主要是partition的过程,partition最常用有以下两种写法第一种: int mypartition(vector&arr, int low, int high) { int pivot = arr[low];//选第一个元素...
阅读全文
摘要:3Sum ClosestGiven an arraySofnintegers, find three integers inSsuch that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is clo...
阅读全文
摘要:对于无向图算法1我们知道对于环1-2-3-4-1,每个节点的度都是2,基于此我们有如下算法(这是类似于有向图的拓扑排序):求出图中所有顶点的度,删除图中所有度 >&graph, int node, vector&visit, vector&father){ int n = graph.size(); visit[node] = 1; //cout"; tmp = father[tmp]; } cout >&graph){ int n = grap...
阅读全文
摘要:问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数)。设两个数组分别是vec1和vec2,元素数目分别是n1、n2。算法1:最简单的办法就是把两个数组合并、排序,然后返回中位数即可,由于两个数组原本是有序的,因此可以用归并排序中的merge步骤合并两个...
阅读全文
摘要:题目链接给定两个正整数a,b,分别定义两个集合L和R,集合L:即把1~a,1~b中整数乘积的集合定义为L = {x * y | x,y是整数且1 b 可以两者交换),a的十进制位数为ka, b的十进制位数为kb。因此异或求解集合R中元素时,只有b的最后ka个二进制位受影响,b的前kb-ka个二进制位可以表示0…2^(kb-ka)-1的所有数。现在我们只考虑b的后面ka个二进制位:1、假设b = 11001,a = 101,那么R = {00001…11001}^{001…101}表示的数有哪些呢? 我们可以看到两者异或后可以表示的最大的数是11001^100 = 11101(注意到后三位异或.
阅读全文
摘要:题目如下甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a Map; static int who (string word) { //用map保存子问题,防止重复计算 //amap[s]表示字符串s由甲操作时甲能否获胜 //bmap[s]表示字符串s由乙操作时甲能否获胜 Map amap, bmap; return (int)dfs(word, 1, amap, bmap); }private: //判断字符串是否严格...
阅读全文
摘要:目录 一、概述 二、从一个例子理解线段树 创建线段树 线段树区间查询 单节点更新 区间更新 三、线段树实战 一 概述 线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。 线段树
阅读全文
摘要:先序遍历:http://www.cnblogs.com/TenosDoIt/p/3416824.html中序遍历:http://www.cnblogs.com/TenosDoIt/p/3445449.html后序遍历:http://www.cnblogs.com/TenosDoIt/p/3416835.html层序遍历:http://www.cnblogs.com/TenosDoIt/p/3440542.html
阅读全文
摘要:pat 2-09 装箱问题模拟 1 #include 2 #include 3 #include 4 using namespace std; 5 6 int findMatchBox(int tsize, vector &box) 7 { 8 for(int i = 0; i = tsize)return i;10 return -1;11 }12 13 int main()14 {15 int N;16 scanf("%d", &N);17 vector box;//box[i]为箱子i的剩余容量18 for(int i = 0; i 2...
阅读全文
摘要:pat1065 A+B and C 主要是注意一下加法溢出的情况,不要试图使用double,因为它的精度是15~16位,不能满足精度要求,代码如下: 1 #include 2 #include 3 #include 4 //double精度为15~16位,不能满足精度要求 5 int main() 6 { 7 int testNum; 8 scanf("%d",&testNum); 9 long long MAX = LONG_LONG_MAX; //pow(2,63) - 1,10 long long MIN = LONG...
阅读全文
摘要:pat 1069The Black Hole of Numbers水题,代码如下: 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 bool isSame(char buf[]) 8 { 9 int i = 1;10 while(buf[i] != '\0')11 {12 if(buf[i] != buf[0])return false;13 else i++;14 }15 ret...
阅读全文
摘要:题目地址:here题目大意:无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,该点称为 deepest root。 给定一个图,按升序输出所有 deepest root。如果给定的图有多个连通分量,则输出连通分量的数量。解法:先任选一点A从该点开始dfs,找出距离该点最远的点B,则B是一个deepest root;然后从B点开始dfs,找到距离B最远的所有点,这些点加上B点都是deepest root。对于有多个连通分支的,我们可以通过遍历完所有节点调用dfs函数的次数来判断(当然也可以用并查集来求连通分支数目)。 ...
阅读全文
摘要:关于素数的基本介绍请参考百度百科here和维基百科here的介绍首先介绍几条关于素数的基本定理:定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子定理2:如果n不是素数,则n至少有一个(1, sqrt(n) ]范围内的素数因子定理3:定义f(n)为不大于n的素数的个数,则 f(n) 近似等于 n/ln(n) (ln为自然对数) ,具体请参考here求不超过n的素数 本文地址算法1:埃拉托斯特尼筛法,该算法的核心思想是:首先标记2~n的数都为素数,然后遍历2~n的数组,如果它是素数,就把它的倍数标记为非素数(即把所有素数的倍数都标记为非素数)代...
阅读全文