我爱算法
本专栏聚集起来我写过的关于算法的原创博客,包括在线编程Leetcode遇到的算法题目,总结的算法使用经验、解法思路。
更详细的分类可以在博客的左侧分类中看到。
文章里的细节会随着我的学习保持更新。
https://github.com/lucky521
ojshilu
https://github.com/lucky521
展开
-
数组的最大子数组积 Maximum Product Subarray
题目:Find the contiguous subarray within an array (containing at least one number) which has the largest product.For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the large原创 2014-10-20 10:40:24 · 1233 阅读 · 0 评论 -
寻找循环有序数组的最小值 Find Minimum in Rotated Sorted Array
二分查找是典型的分治思想,主要应用于有序顺组相关的查找问题。典型原创 2014-10-20 10:14:02 · 2520 阅读 · 0 评论 -
单词变换路径 Word Ladder II
这一问题是《单词变换距离 Word Ladder (无权图的最短路径) 》的引申问题。Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:Only one let原创 2014-04-02 17:09:10 · 2678 阅读 · 0 评论 -
最小回文分割数 Palindrome Partitioning II
问题:Given a string s, partition s such that every substring of the partition is a palindrome.Return the minimum cuts needed for a palindrome partitioning of s.For example, given s = "aab",原创 2014-04-01 21:35:09 · 3440 阅读 · 0 评论 -
有效数判定 Valid Number
问题:给出一个字符串,判断它是否是一个有效的数字。什么叫有效的数字呢?整数 ,小数 "2.5",正数 "+25",负数"-25",科学计数法"-2e1+0"。特殊用例:“.5”, “5.” 认为是有效数字。无效用例:“.", "e25", "25e", "2e5e5", "2.5.5", "2e2.5"输入检查:左右两端出现空格是允许的,内部不能有空格。class原创 2014-04-01 19:30:04 · 1846 阅读 · 2 评论 -
通配符匹配字符串 Wildcard Matching
问题:实现支持?和*两个通配符的字符串匹配函数。Implement wildcard pattern matching with support for '?' and '*'.'?' Matches any single character.'*' Matches any sequence of characters (including the empty sequence).原创 2014-03-31 22:09:34 · 2424 阅读 · 2 评论 -
Cache的设计和实现 LRU Cache
Cache的应用非常广泛,其实Cache是一种思想,一个广义的词汇,一种在性能和金钱的权衡上的思想。Cache的思想用在很多地方,使用的载体也不同,都是位于相对高速设备和相对低速设备之间,起到缓存的作用。1、最常用处:用在内存和CPU之间,以SRAM作为Cache的载体。(内存是DRAM,CPU是寄存器)2、用在内存和硬盘之间。3、用在硬盘和网络之间。原创 2014-03-31 09:52:26 · 2655 阅读 · 0 评论 -
被包围的棋子 Surrounded Regions
问题:Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.A region is captured by flipping all 'O's into 'X's in that surrounded region.For example,X X X XX O O XX原创 2014-03-30 19:22:57 · 9325 阅读 · 5 评论 -
文本布局调整 Text Justification
问题:Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified.You should pack your words in a greedy approach;原创 2014-03-30 17:28:29 · 1391 阅读 · 0 评论 -
变形字符串识别 Scramble String
问题:Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.Below is one possible representation of s1 = "great": great / \原创 2014-03-27 19:51:42 · 1675 阅读 · 0 评论 -
Leetcode题:Substring with Concatenation of All Words
You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without an原创 2014-03-26 21:23:50 · 5905 阅读 · 0 评论 -
计算逆波兰式 Evaluate Reverse Polish Notation
问题:Evaluate the value of an arithmetic expression in Reverse Polish Notation.Valid operators are +, -, *, /. Each operand may be an integer or another expression.Some examples: ["2",原创 2014-03-24 09:54:05 · 1685 阅读 · 0 评论 -
寻找排列数中的第k个数 Permutation Sequence
问题:The set [1,2,3,…,n] contains a total of n! unique permutations.By listing and labeling all of the permutations in order,We get the following sequence (ie, for n = 3):"123""132""213""2原创 2014-03-24 21:11:32 · 2245 阅读 · 0 评论 -
找出较大的下一个数字组合 Next Permutation
问题:Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.If such arrangement is not possible, it must rearrange it as the lowest possi原创 2014-03-22 18:51:31 · 1964 阅读 · 0 评论 -
回文子串划分 Palindrome Partitioning
问题:将一个字符串进行划分,要求划分成的子串都必须是回文串。找出所有可能的划分情况。思路:backstrack吧,每一次只有在满足是回文的情况下深入下一层。class Solution {public: vector> partition(string s) { vector > result; vector now; if(s.s原创 2014-03-21 19:21:53 · 1481 阅读 · 0 评论 -
生成所有可能的二叉排序树 Unique Binary Search Trees II
问题:Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.For example,Given n = 3, your program should return all 5 unique BST's shown below. 1原创 2014-03-21 12:39:21 · 1270 阅读 · 0 评论 -
找出穿过最多点的直线 Max Points on a Line
平面上有若干个点,要你找出一条直线,使其能穿过最多的点。思路:枚举法。求出任意两点之间的线,以直线(斜率,与y轴的交点坐标)的形式存储到map。这样个数最多的直线就是所求。时间O(N^2),空间O(N).注意特殊情况:1、当直线的斜率为无穷大时,其与y轴没有交点,但是和x轴的交点不相同,这时候我需要特殊表示一下。2、点集中有重叠的点时,算几个点?原创 2014-03-20 21:34:52 · 6174 阅读 · 2 评论 -
有障碍物的矩阵格路径的个数 Unique Paths II
在《矩形格路径的个数 Unique Paths》中,介绍了求解矩阵格路径个数的两种方法,这种属于没有阻碍的路径个数。本文要处理的问题是,如果人为的在矩阵的某些格子中布置障碍物,意味着不能通过该格子。那么格路径的个数如何求解。思路:该问题仍然具有子问题。还是可以采用动态规划方法。设置状态量H[][],H[i][j]表示从A[0][0]格子到A[i][j]格子的路径个数。递推关系:原创 2014-03-20 13:14:01 · 3060 阅读 · 0 评论 -
简单的限定个数组合生成 Combinations
问题:Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.For example,If n = 4 and k = 2, a solution is:[ [2,4], [3,4], [2,3], [1,2], [1,3原创 2014-03-19 13:23:43 · 1048 阅读 · 0 评论 -
找出数组中和为指定值的四个数 4sum
问题:Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.Note:原创 2014-03-18 22:13:02 · 1368 阅读 · 0 评论 -
一个序列里的数字都是成对的,只有一个是单个的,找出来。
#include#includeusing namespace std;int main(){ int n,result=0; scanf("%d",&n); if(n%2 == 0) { printf("impossible!\n"); //这样的序列的个数一定是奇数个元素 return 0; } int *a = new int[n]; f原创 2013-07-15 21:07:52 · 2216 阅读 · 1 评论 -
大数的乘法 Multiply Strings
# include# include# include void multiply(char* a,char* b,char* c){ int i,j,ca,cb,* s; ca=strlen(a); cb=strlen(b); s=(int*)malloc(sizeof(int)*(ca+cb)); for (i=0;i<ca+cb;i++)原创 2013-08-22 16:16:32 · 1471 阅读 · 1 评论 -
两个有序链表的合并 Merge Two Sorted Lists
1、记着怎么定义这样的结构体。typedef struct node{ int data; struct node *next;}node, *List;2、到哪儿都注意,防止指针为空、防止链表为空。List merge(List l1, List l2){ node *p3; List l3=NULL; if(l1==NULL) return l2原创 2013-09-05 12:55:33 · 1391 阅读 · 0 评论 -
只用位运算来实现整数的加减乘除四则运算
问题一: 位运算实现加法问题二:只用加法实现减法、乘法、除法问题三:只用加法实现1+2+3+...+n,(循环、判断语句也不用)下面逐一解决:问题三:方法1:只用加法实现1+2+3+...+n1、利用递归来代替循环结构;2、利用&&与运算的特性来代替if结构。int add(int n, int &sum)原创 2013-09-05 22:21:38 · 15741 阅读 · 5 评论 -
交错字符串 Interleaving String
题目源自待字闺中的微信。判断字符串c是否是字符串a和字符串b按顺序的交错(interleave)。关键问题:判断一个字符串是否是另一个字符串的子序列。需要用O(n)时间来解决。int issubsequence(char *m, char *s){ if(m == NULL || s == NULL) return NULL; int i=0,j=0; while(原创 2013-09-17 13:46:10 · 1968 阅读 · 0 评论 -
根据前序和中序序列重建二叉树 Construct Binary Tree from Preorder and Inorder Traversal
9oj编号1385。题目:根据二叉树的前序遍历序列和中序遍历序列,求得该二叉树的后序遍历序列。注意:有个前提,二叉树中的所有元素都不相同。方法:根据前序序列和中序序列重建二叉树原型,然后进行后序遍历。所以关键就在于重建二叉树。使用递归的方法比较容易。如下图所示,对于二叉树的构建过程也是递归的。首先把当前前序遍历序列的第一个元素作为root结点,并在在中序遍历中找原创 2013-09-20 22:18:02 · 1238 阅读 · 0 评论 -
寻找最长无重复字符子串 Longest Substring Without Repeating Characters
要求:Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. F原创 2013-09-29 16:42:20 · 1501 阅读 · 0 评论 -
无序数组中找出和为N的两个数 Two Sum
如果是有序数组,很简单。两头指针往中间相遇即可。因此对于无序数组,排序即可。唯一的麻烦题目要求的:要返回两个数在排序之前原数组里的序号。因此我需要在排序时也要保留原来的序列号。这里主要是以前不写STL的程序。这里用到vector。pair。sort。vector常用到的vector.size()表示当前vector里的数据个数。初始化vector时用 vector v;原创 2013-09-30 14:20:52 · 4260 阅读 · 0 评论 -
两个链表的数字相加(简单题) add two numbers
题目:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a原创 2013-10-03 12:32:48 · 1674 阅读 · 0 评论 -
依然是最长回文子串 9OJ-1528
1528编号的9oj,回文问题。这个题用比较好的动态规划法的话会出现内存溢出,因为输入的字符串长度太长了。表示状态量的二维数组存不下。换成最直观的办法反倒AC了。就是:依次以每一个字符为回文中心往两端扩大判断,依次以两个相同的字符为中心往两端扩大判断。#include #include #include #define N 200000int LongestPalin原创 2013-10-03 16:53:34 · 924 阅读 · 0 评论 -
ZigZag Conversion
题目源自于Leetcode,非常简单的一道题。最重要是理解题意,知道什么是zigzag。开始有点受题目上的排版干扰。后来发现,其实就是走的折线,如n=5:0123432101234321……一直波动。解法:用的vector的数组分别保存每个行。之后再s.assign(v.begin(),v.end())赋值给string。代码:#include #incl原创 2013-10-13 14:06:43 · 1081 阅读 · 0 评论 -
将一个整数逆转 Reverse Integer
题目源自于Leetcode。Example1: x = 123, return 321思路:看到这题,一定要想到这几个问题。这就要看你这个人考虑问题是不是周到全面!1、负数的情况,怎么处理?2、原数后面有0,逆转之后怎么处理? 保留还是去掉?3、逆转之后溢出怎么处理? 32位int的表示范围是–2,147,483,648 ~ 2,147,483,647。原创 2013-10-13 14:37:58 · 1715 阅读 · 0 评论 -
实现String to Integer (atoi)
题目源自于Leetcode。思路:一定要考虑所有的情况。一、合法性检查1、输入字符型指针是否指向空?2、输入字符串内是否有非阿拉伯数字?(是否允许字符串开头有空格?是否允许字符串后面出现其他字符?)二、特殊情况1、正负数情况2、溢出情况的判断:这里我用的是一个64位整型数来帮忙的。INT_MAX (2147483647) 和 INT_MIN (-原创 2013-10-13 15:37:39 · 1179 阅读 · 0 评论 -
判断一个整数是否是回文数 Palindrome Number
题目源自于Leetcode。Determine whether an integer is a palindrome. Do this without extra space.思路:1、不可以借助辅助空间。即要求空间复杂度为O(1)。如果把int转换为字符串,那么空间复杂度就不符合要求了。2、注意一下,要考虑到:负数的情况怎么算?3、如果想要逆转整数,一定要注意防止溢出的问原创 2013-10-13 16:32:34 · 5278 阅读 · 1 评论 -
简单的正则表达式匹配 Regular Expression Matching
题目源自于Leetcode。只需要支持两个匹配符*和.。'.' Matches any single character.'*' Matches zero or more of the preceding element.本题的要求是能够全部匹配整个母字符串,而不是包含有。The matching should cover the entire input string (no原创 2013-10-13 22:41:33 · 2432 阅读 · 0 评论 -
寻找最大储水量的容器 Container With Most Water
题目源自于leetcode。题目:数组的n个数值代表n个高度各异的垂线段。以x轴作为底座,选2个垂线段作为高。形成一个三面的容器。求储水量最大的那个。方法:容器的储水量与底座长度和2边高的较小值有关。如果使用双循环依次选取两个高进行判断,时间复杂度太高。O(n*n)。较好的方法是左右端双指针向中间接近。因为要找的是最大值,所以让底座首先是最大值。如果左指针所在的高度较低,则原创 2013-10-17 08:55:28 · 1946 阅读 · 0 评论 -
将罗马数字字符串转换为阿拉伯整形数 Roman to Integer
题目源自于leetcode,和前一道是正好相反的计算。另一道题在http://blog.csdn.net/luckyjoy521/article/details/12836795思路:需要进行字符串的匹配,但是罗马数字并不是前/后缀编码,暂时没有想到好的方法。所以就枚举吧。代码:class Solution {public: int romanToInt(st原创 2013-10-18 14:34:56 · 1626 阅读 · 0 评论 -
将阿拉伯数字转换成罗马数字 Integer to Roman
题目源自于leetcode。题目:将一个int型的阿拉伯数字转换为string型的罗马数字。方法:首先要知道罗马数字的表示法。个位、十位、百位、千位都是特点的字幕作为权值,每一个位的10个数字的表示方法也类似,都会在5有另一个中间的字母。 M=1000 D = 500原创 2013-10-17 14:27:33 · 3977 阅读 · 0 评论 -
寻找若干个字符串的最长公共前缀 Longest Common Prefix
题目来源于Leetcode。题目:给出若干个字符串,找出他们的最长公共前缀子串。假设这里字符串有n个,平均长度为m。方法:1、所求的最长公共前缀子串一定是每个字符串的前缀子串。所以随便选择一个字符串作为标准,把它的前缀串,与其他所有字符串进行判断,看是否是它们所有人的前缀子串。这里的时间性能是O(m*n*m)。2、列出所有的字符串的前缀子串,将它们合并后排序,找出其中个数为n且原创 2013-10-20 11:44:19 · 10982 阅读 · 2 评论 -
手机键盘上的排列组合问题 Letter Combinations of a Phone Number
题目源自于Leetcode。题目:Given a digit string, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons) is given below.思路:原创 2013-10-20 17:25:50 · 1433 阅读 · 0 评论