
Algorithm
文章平均质量分 77
qinzhaokun
这个作者很懒,什么都没留下…
展开
-
卡塔兰数应用----所有括号的组合
vector generateParenthesis(int n) { vector ans; string s; if (n>0) generator(ans, s, 0, 0, n); return ans; } // l/r: number of '(' / ')' void generator(vect转载 2015-08-26 20:14:07 · 912 阅读 · 0 评论 -
算法学习--线性表
链表反转:链表反转也是比较常见的一个面试题。方法1. 迭代。 分别设置三个指针。第一个指针保持结果,第二个指针指向当前的节点,第三个指针保存下一个节点。static void reverse(struct node** head_ref){ struct node* prev = NULL; struct node* current = *head_r转载 2016-02-06 17:49:48 · 786 阅读 · 0 评论 -
算法学习--二叉树
二分查找树转化为排序的循环双链表输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。例如对于下面的二分查找树:small pointer 其实也就是指向左孩子,large pointer指向右孩子,转化为双链表之后 small pointer应该指向前一个元素,large pointer应该指向后一个元素。转载 2016-02-06 20:27:18 · 720 阅读 · 0 评论 -
算法学习--栈
包含min函数的栈题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。转载 2016-02-10 17:36:00 · 582 阅读 · 0 评论 -
算法学习--排序与查找
二分查找我们都知道二分查找算法,实际上二分查找以及其扩展应用是很广泛的。这里收集了一些和二分查找有关的有趣问题。强烈建议大家看完问题后最小化浏览器,先尝试自己去解决,然后再看代码,问题都不是太难。问题1描述给一个已经排序的数组,其中有N个互不相同的元素。要求使用最小的比较次数找出其中的一个元素。(你认为二分查找在排序数组里找一个元素是最优的算法的吗?)不需要太多的理转载 2016-02-11 18:17:06 · 1397 阅读 · 0 评论 -
算法学习--贪心算法
任务选择问题贪心算法又称贪婪算法是指,在对问题求解时,总是做出在当前看来是最好的选择。当一个问题具有以下的性质时可以用贪心算法求解:每一步的局部最优解,同事也说整个问题的最优解。如果一个问题可以用贪心算法解决,那么贪心通常是解决这个问题的最好的方法。 贪婪算法一般比其他方法例如动态规划更有效。但是贪婪算法不能总是被应用。例如,部分背包问题可以使用贪心解决,但是不能解决0转载 2016-02-12 17:07:48 · 4515 阅读 · 0 评论 -
算法学习--数学相关
欧几里得算法--求最大公约数欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。 证明略去了。基本代码实现:int gcd(int a,int b){ if(b==0) return a; ret转载 2016-02-16 14:45:51 · 820 阅读 · 0 评论 -
算法学习--位运算
检测一个数能否被3整除第一个解决方案就是小学就学过的,如果一个数的每个位相加之和能被3整除,则这个数就可以被3整除。例如612各位之和为9,则可以被3整除。但是这个解决方法并不高效,我们需要取得每一位,然后再一个个相加。观察二进制,我们可以找到一个模式来判断一个数能否被3整除。如果所有的偶数位出现1的次数为 even_count, 奇数位出现1的次数为 odd_count,两者转载 2016-02-17 17:41:05 · 1625 阅读 · 0 评论 -
算法学习--图论
最大流问题-Ford-Fulkerson算法问题:有一个自来水管道运输系统,起点是s,终点是t,途中经过的管道都有一个最大的容量。求从s到t的最大水流量是多少?网络最大流问题是网络的另一个基本问题。许多系统包含了流量问题。例如交通系统有车流量,金融系统有现金流,控制系统有信息流等。许多流问题主要是确定这类系统网络所能承受的最大流量以及如何达到这个最大流量。如下图转载 2016-02-18 16:43:12 · 1277 阅读 · 0 评论 -
算法学习--回朔和剪枝
骑士旅游问题问题描述:在一个N*N 格子的棋盘上,有一只国际象棋的骑士在棋盘的左下角,骑士只能根据象棋的规则进行移动,要么横向跳动一格纵向跳动两格,要么纵向跳动一格横向跳动两格。骑士从第一个格子出发,每个格子只能访问一次,能否访问完所有的格子, 请找到一个解决方案。骑士也就是类似中国象棋中的马的走法。这个问题和典型的N皇后问题的比较类似的,都可以通过回溯法来解决。还有其它的解决转载 2016-02-18 21:40:59 · 711 阅读 · 0 评论 -
卡塔兰数的应用
转自:http://blog.youkuaiyun.com/wuzhekai1985问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 该递推关系的解为:h(n)=C(2n,n)/转载 2015-08-26 09:36:16 · 1062 阅读 · 0 评论 -
算法学习--模式匹配
模式匹配-BF算法到KMP算法模式匹配 子串的定位操作通常称为串的模式匹配。模式匹配的应用很常见,比如在文字处理软件中经常用到的查找功能。我们用如下函数来表示对字串位置的定位:int index(const string &Tag,const string &Ptn,int pos) 其中,Tag为主串,Ptn为子串(模式串),如果在主串Tag的第p转载 2016-02-19 14:54:57 · 928 阅读 · 0 评论 -
算法学习--动态规划
动态规划(DP)通过分解成子问题解决了给定复杂的问题,并存储子问题的结果,以避免再次计算相同的结果。我们通过下面这个问题来说明这两个重要属性:1)重叠子问题2)最优子结构1)重叠子问题:像分而治之,动态规划也把问题分解为子问题。动态规划主要用于:当相同的子问题的解决方案被重复利用。在动态规划中,子问题解决方案被存储在一个表中,以便这些不必重新计算。因此,如果转载 2016-02-13 18:03:29 · 3744 阅读 · 2 评论 -
算法学习--子集
关于子集:题目很简单,给定一个数组,数组每个元素都不重复,要求生成所有的子集。对于没有重复的元素,可以有两种思路:1: 对于每个元素,可以选择放入,或者不放,两种情况都递归下去,什么时候不需要的递归了呢,那就是直到最后一个元素,这个思路有点像找全排列的算法。public class Solution { public List> subsets(int[] nums) {原创 2016-03-09 13:45:50 · 754 阅读 · 0 评论 -
位操作基础篇之位操作全面总结
原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7354571在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中转载 2015-10-08 15:44:37 · 325 阅读 · 0 评论 -
leetcode: Word Break 纪念又一次死在动态规划上
动态规划是算法中的一个基本的算法,但是个人感觉变化很多,有时候知道能够用,但是却想不到思路。Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.原创 2015-10-08 15:13:05 · 2243 阅读 · 0 评论 -
强连通分量算法
一:无向图的强连通分量算法向图的连通分量就都是强连通分量。无向图的强连通分量就是用DFS算法顺序遍历邻接表时顺道干点小动作,写下代码更直观一些:#define maxN 1024int marked[maxN];//用于记录某个点是否被访问过,0为没有被临幸过,1为被临幸过int id[maxN];//记录每个点所属的连通分量int count;//记录连通分量总数目void转载 2015-09-18 09:35:20 · 1048 阅读 · 1 评论 -
一维动态规划总结
转:http://blog.youkuaiyun.com/linhuanmars/article/details/38468361这篇文章的主题是动态规划, 主要介绍LeetCode中一维动态规划的题目, 列表如下: Climbing StairsDecode WaysUnique Binary Search TreesMaximum SubarrayM转载 2015-08-30 19:49:00 · 536 阅读 · 0 评论 -
5.Longest Palindromic Substring
Longest Palindromic SubstringGiven 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 longest palindrom原创 2015-08-15 14:48:51 · 342 阅读 · 0 评论 -
6.ZigZag Conversion
ZigZag ConversionThe string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)P原创 2015-08-15 14:54:35 · 311 阅读 · 0 评论 -
1.Two Sum
Two SumGiven an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to the原创 2015-08-15 13:44:35 · 460 阅读 · 0 评论 -
10.Palindrome Number
Palindrome NumberDetermine whether an integer is a palindrome. Do this without extra space.click to show spoilers.Some hints:Could negative integers be palindromes? (ie, -1)原创 2015-08-15 15:21:25 · 349 阅读 · 0 评论 -
4.Median of Two Sorted Arrays
Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log原创 2015-08-15 14:45:32 · 397 阅读 · 0 评论 -
3.Longest Substring Without Repeating Characters
Longest Substring Without Repeating CharactersGiven a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters原创 2015-08-15 14:24:06 · 438 阅读 · 0 评论 -
8.String to Integer (atoi)
String to Integer (atoi)Implement atoi to convert a string to an integer.Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself原创 2015-08-15 15:11:38 · 493 阅读 · 0 评论 -
动态规划方法总结1
原题链接:http://oj.leetcode.com/problems/maximum-subarray/ 这是一道非常经典的动态规划的题目,用到的思路我们在别的动态规划题目中也很常用,以后我们称为”局部最优和全局最优解法“。基本思路是这样的,在每一步,我们维护两个变量,一个是全局最优,就是到当前元素为止最优的解是,一个是局部最优,就是必须包含当前元素的最优的解。接下来说说动态规划的递推转载 2015-08-15 19:21:52 · 609 阅读 · 0 评论 -
2.Add Two Numbers
Add Two NumbersYou 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 an原创 2015-08-15 14:02:29 · 376 阅读 · 0 评论 -
最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
本文内容框架:§1 Dijkstra算法§2 Bellman-Ford算法§3 Floyd-Warshall算法§4 Johnson算算法§5 问题归约 §6 小结常用的最短路径算法有:Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法最短路径算法可以分为单源点最短路径和全转载 2015-09-06 16:03:38 · 1193 阅读 · 1 评论 -
Floyd算法:用动态规划求解多源(全源)最短路径
loyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(原创 2015-09-06 15:52:12 · 1667 阅读 · 0 评论 -
拓扑排序的两种实现:Kahn算法和dfs算法
本文将从以下几个方面介绍拓扑排序:拓扑排序的定义和前置条件和离散数学中偏序/全序概念的联系典型实现算法Kahn算法基于DFS的算法解的唯一性问题实际例子取材自以下材料:http://en.wikipedia.org/wiki/Topological_sortinghttp://en.wikipedia.org/wiki转载 2015-09-18 08:20:28 · 20123 阅读 · 7 评论 -
匈牙利算法
匈牙利算法是解决二分图匹配的算法,首先看看什么是二分图。如果一个图是二分图,那么可以将其顶点分成两部分,使得没一条边对应的顶点都分别在两个集合。其充分必要条件是不存在回路或者不存在奇数顶点的回路。判断二分图可用DFS/BFS着色。二分图的匹配:一组边的集合,使得任意两条边都没有公共的顶点。而匈牙利算法可以找到二分图的最大匹配。核心思想是寻找增广路径。摘自别人博客的例子:通过原创 2016-06-09 20:41:05 · 2378 阅读 · 0 评论