随笔分类 -  算法

摘要:什么是回文?举两个栗子 上海自来水来自海上 黄山落叶松叶落山黄 如何判断链表是不是回文呢? 完美。 阅读全文
posted @ 2017-11-18 20:52 Sawyer Ford 阅读(1167) 评论(0) 推荐(0)
摘要:面试中经常遇到反转单链表,特此总结。 递归版 算法执行过程如下 非递归版 将头结点后面的结点通过头插法一个个地插入到链表前面。 算法执行流程如下 阅读全文
posted @ 2017-11-18 19:30 Sawyer Ford 阅读(213) 评论(0) 推荐(0)
摘要:给定N个数,从中找出若干个数,使得这些数的和等于sum。 TwoSum MultiSum 0-1背包问题。 参考资料: 寻找和为定值的多个数 k Sum 阅读全文
posted @ 2017-11-11 22:13 Sawyer Ford 阅读(669) 评论(0) 推荐(0)
摘要:题目定义: 给定一个大小为n的数组,无序,找到其中的最大值和最小值,要求元素间的比较次数尽可能少。这道题出自《算法导论》。创新工场2016校招笔试也考了这道题。以下摘自《算法导论》: 事实上,我们只需要最多3⌊n/2⌋次比较就可以同时找到最小值和最大值。具体的方法是记录已知的最大值和最小值,然后... 阅读全文
posted @ 2015-09-16 20:12 Sawyer Ford 阅读(889) 评论(0) 推荐(0)
摘要:0-1背包问题(0-1 knapsack problem)是这样的:一个正在抢劫商店的小偷发现了n个商品,第i个商品价值vi美元,种wi磅,vi和wi都是整数。这个小偷希望拿走价值尽量高的商品,但他的背包最多能容纳W磅重的商品,W是一个整数。他应该拿哪些商品呢?(我们称这个问题为0-1背包问题,因为... 阅读全文
posted @ 2015-09-07 09:50 Sawyer Ford 阅读(303) 评论(0) 推荐(0)
摘要:题目很简单,就是实现两个很大整数的相加操作,具体描述参见A + B Problem II直接贴一个我写的代码:string bigIntegerAdd(string s1, string s2){ int len1 = s1.size(); int len2 = s2.size(); ... 阅读全文
posted @ 2015-09-06 15:29 Sawyer Ford 阅读(221) 评论(0) 推荐(0)
摘要:问题描述: 给定两个序列 X=, Y,求X和Y长度最长的公共子串。(子串中的字符要求连续) 这道题和最长公共子序列(Longest common subsequence)很像,也可以用动态规划定义。公式如下:这里c[i,j]表示以Xi,Yj结尾的最长公共子串的长度。程序实现:int longes... 阅读全文
posted @ 2015-08-12 19:49 Sawyer Ford 阅读(282) 评论(0) 推荐(0)
摘要:问题定义: 给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续)。 这道题共3种解法。1. 动态规划 动态规划的核心是状态的定义和状态转移方程。定义lis(i),表示前i个数中以A[i]结尾的最长递增子序列的长度。可以得到以下的状态转移方程:d(i) = max(1, d(j)... 阅读全文
posted @ 2015-08-12 16:34 Sawyer Ford 阅读(285) 评论(0) 推荐(0)
摘要:给定两个字符串S、P,如何判断S中包含P?(假设S为较长字符串,要求P中字符在S中要连续出现) 这就是经典的字符串匹配问题。暴力匹配略去不说,一种较好的解法就是KMP。对于一个新手来说,想学习KMP,建议看如下两篇文章:字符串匹配的KMP算法(阮一峰)从头到尾彻底理解KMP(2014年8月22... 阅读全文
posted @ 2015-08-12 10:48 Sawyer Ford 阅读(212) 评论(0) 推荐(0)
摘要:问题描述: 给定两个序列 X=, Y,求X和Y长度最长的公共子序列。(子序列中的字符不要求连续) 这道题可以用动态规划解决。定义c[i, j]表示Xi和Yj的LCS的长度,可得如下公式:伪代码如下:C++实现:int longestCommonSubsequence(string x, strin... 阅读全文
posted @ 2015-08-10 10:15 Sawyer Ford 阅读(3101) 评论(0) 推荐(0)
摘要:快速排序是相当重要的一种排序方法。它的特点有:1. 平均时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)。2. 平均空间复杂度为O(logn),最坏空间复杂度为O(n)。3. 不稳定 快排的实现方法有多种,这里只列出常用的两种。单向扫描版:int partition(int arr[... 阅读全文
posted @ 2015-08-05 09:21 Sawyer Ford 阅读(264) 评论(0) 推荐(0)
摘要:全部内容来自《剑指offer》。题目一: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字符一样处理。例如输入字符串“I am a student.”,则输出“student. a am I”。ANSWER:void reverse(char *pB... 阅读全文
posted @ 2015-07-18 19:04 Sawyer Ford 阅读(179) 评论(0) 推荐(0)
摘要:1. 二分查找//递归版int binarySearch(const int arr[], int low, int high, int val){ if (low arr[mid]) return binarySearch(arr, mid+1, high, val)... 阅读全文
posted @ 2015-07-12 15:10 Sawyer Ford 阅读(289) 评论(0) 推荐(0)
摘要:问题如下: 现有n个不同的整数,如何从中随机选出m个不同的数。(m<=n) 思路: 一提到随机数函数,我们立即想到rand(),此函数使用方法如下: 要取得[a,b)的随机整数,使用 rand()%(b-a) + a; 要取得[a,b]的随机整数,使用 rand()%(b-a+1) + a; 要取得 阅读全文
posted @ 2014-11-09 16:07 Sawyer Ford 阅读(423) 评论(0) 推荐(0)