算法
ckl_soft
加油!
展开
-
SRM 497 div 2 1000pt
(求将串处理成由两个相同子串拼接成最少步数)原创 2011-02-16 00:29:00 · 686 阅读 · 0 评论 -
[LeetCode]Best Time to Buy and Sell Stock 系列
本题是Best Time to Buy and Sell Stock/的改进版。本题中,可以买最多买进卖出两次股票。买两次股票可以看成是第0~i天买进卖出以及第i+1~n-1天买进卖出两部分。这要枚举i并求出0th~ith的最大利益与(i+1)th~(n-1)th的最大利益之和的最大值就是买进卖出两次可以得到的最大利益。即状态转移方程:dp[0,n-1]=max{dp[0,k]+dp[原创 2014-11-10 22:56:47 · 4442 阅读 · 0 评论 -
[LeetCode]Reorder List 链表重排序
采用递归就可以做,类似于树的后续遍历。需要同时维护一个指向链表前半部分的指针p2(指向了要插入的位置,可以采用全局变量或数组引用的方式来维护)。注意,在p2已经到达链表末尾时整个过程就结束了,这里采用一个全局标记end来标记是否已经结束。class Solution {public: bool end; void travel(ListNode*p1, ListNode*&p原创 2014-11-10 17:13:09 · 3986 阅读 · 0 评论 -
[LeetCode]Wildcard Matching 通配符匹配(贪心)
一开始采用递归写,TLE。class Solution {public: bool flag; int n,m; void dfs(int id0,const char *s,int id1,const char *p){ if(flag)return; if(id0>=n){ if(id1>=m)flag=1; else{ int j=0; whi原创 2014-11-09 14:33:19 · 5212 阅读 · 0 评论 -
[LeetCode]Unique Binary Search Trees II 分治
生成所有可能的/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };原创 2014-11-04 22:33:32 · 724 阅读 · 0 评论 -
[LeetCode]Subsets II生成组合序列
class Solution {//生成所有【不重复】的组合。生成组合只要采用递归,由序列从前往后遍历即可。至于去重,根据分析对应的递归树可知,同一个父节点出来的两个分支不能一样(即不能与前一个元素一样,且前一个元素要与之在同层)。public: int *b,n; vectora; vector >ans; void dfs(int id,int len){原创 2014-11-04 00:46:36 · 1082 阅读 · 0 评论 -
[LeetCode]Word Ladder 字符串的最短转换距离 (Dijkstra)
要求最短距离。采用dijkstra求节点间最短路径。注意点:如果是枚举字典中两两元素是否可转换的话,会超时。改进:对于每个字符串,枚举其各位字符的取值情况,则对于长度为n的一个字符串要枚举n*26次。如果只是简单的枚举,则会出现重边:如abc,bbc,cbc,建图后每两个节点间均有两条双向边,这对于邻接表存储的图会存在很多冗余边。解决方法:每个节点每位字符只能从原始字符往后枚举原创 2014-11-04 11:31:59 · 2331 阅读 · 0 评论 -
[LeetCode]Copy List with Random Pointer &Clone Graph 复杂链表的复制&图的复制
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL),原创 2014-11-04 09:43:52 · 1388 阅读 · 0 评论 -
[LeetCode]longest consecutive sequence
class Solution {//用set判断一个元素是否存在于集合中O(logn)。用到的一个优化是连续的x个数对应的序列长度都是一样的,可以通过判断元素是否遍历过来避免查找。没有这一步会超时。有的也用unordered_set代替set,据说这是hash表,O(1),更快。public: int longestConsecutive(vector &v) { if(原创 2014-11-03 23:45:44 · 740 阅读 · 0 评论 -
[LeetCode]Two Sum 【Vector全局指针的使用】
无序数组返回两个元素和为给定值的下标。tricks:无序、返回下标增序、返回的是原始数组的下标。vector*pa;bool cmp(int x,int y){ return (*pa)[x]<(*pa)[y];}class Solution {public: vector twoSum(vector &a, int t) { int n=a原创 2014-11-04 21:12:50 · 1255 阅读 · 0 评论 -
[LeetCode]Candy 递归
分发糖果,要求具有更大rating的人原创 2014-11-04 23:48:46 · 788 阅读 · 0 评论 -
[LeetCode]atoi 边界条件
需要跳过前置的空格和0;必须考虑前置符号;int的取值范围为[0x7fffffff, 0x80000000],如果超过了这个边界,则取边界。为了判断是否超过边界,需要用一个更大的整数类型表示,这里用long long;“ -12a12” 输出的是前面有效部分-12class Solution {public: int atoi(const ch原创 2014-11-05 09:51:15 · 1109 阅读 · 0 评论 -
[LeetCode]Surrounded Regions
题意:将被‘X’包围的‘O’修改成'X'。方法:从最外围的‘O’出发,找可连接的‘O’,则这些‘O’最终都是不要标记的,剩余的‘O’是需要标记的。这里可先将从外围‘O’可遍历到的‘O’标记为其他字符,最终再统一恢复。法2:也可从所有‘O’探索,只要无法探索到越界即满足,可以用一个栈保存这些中间节点。具体实施:bfs(用dfs会爆栈RE。。。)int dir[4][2]={-1,0,1,原创 2014-11-04 19:42:50 · 774 阅读 · 0 评论 -
[LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)
二分。情况讨论class Solution {public: int findPos(int* p,int n,int x){ int low=0,high=n-1,mid; while(low<=high){ mid=(low+high)>>1; if(p[mid]<=x)low=mid原创 2014-11-06 00:43:23 · 2376 阅读 · 0 评论 -
[LeetCode]Insert Interval 考虑多种情况
写太复杂了。思想:确定带插入区间的每个边界位于给定区间中的哪个位置,共有5种情况 -1 |(0)_1_(2)| (3)其中,0,1,2这三种情况是一样的。确定每个带插入区间的两个边界分别属于哪种情况,记为flag0和flag1。然后根据flag0和flag1的组合情况,分9种情况进行讨论class Solution {public: vector i原创 2014-11-05 13:28:47 · 1023 阅读 · 0 评论 -
[LeetCode]Gas Station 最大子序列和,贪心
在一个环形路径上分布着n个加油站,从一个加油站到下一个加油站会耗油。要找出一个起始点,从这个起始点出发,存油量>=耗油量。解保证唯一。这要求在路径上不能出现非负的。如果找出存油量最大的子序列,则可确保尽可能走完全程(贪心思想)。因此,需要在环形数组中找一个最大子序列和。最大子序列和是很经典的DP问题,而针对环形约束,采用的是将数组复制一份并放到原数组最后,然后采用普通的最大子序列求解。原创 2014-11-05 20:44:11 · 2695 阅读 · 0 评论 -
[LeetCode] 3Sum 找出所有三个元素之和为0的组合
本题是查找两个数使和为给定值的变形。一开始采用的是维护两个下标(即目标三元组中的最小值和最大值),两边向中间逼近。针对两个下标,利用二分法找出介于二者之间的数。写完之后,有个数据过不去,原因在于两个下标有可能需要往外移动,而非仅仅是逼近,如:[-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]三元组(-2,1,3)的下一个是(-2,-2,4),此时下标由3回复到4,而原创 2014-11-10 11:17:18 · 4821 阅读 · 0 评论 -
[LeetCode]Single Number 异或的妙用
1、数组中只有一个元素只出现一次,其余出现偶数次。利用异或中相同元素相互抵消的方式求解。2、数组中只有2个元素只出现一次,其余出现偶数次。class Solution {public: int singleNumber(int A[], int n) {//返回只出现一次的元素 if(n==1)return A[0]; int i,sum=A原创 2014-11-10 00:49:49 · 4306 阅读 · 0 评论 -
[LeetCode]Distinct Subsequences 匹配(不要求连续)的子串
一开始第一反映是用暴搜+回溯剪枝,妥妥的超时,见numDistinct0函数。后来想到这跟公共子串有点类似,满足最优子结构和重叠问题,因此可用DP。状态转移方程如下: { dp[i-1,j-1]+dp[i-1][j] , 当s[i]==s[j],0dp[i,j]={ dp[i-1][j], 当s[i]!=s[j] ,0原创 2014-11-09 23:08:51 · 4470 阅读 · 0 评论 -
KM算法最好的讲解[转]+POJ2195[KM算法+最小费用流]
//*******************************以下是转载的**********************************************二分图匹配算法总结 二分图最大匹配的匈牙利算法二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。最大匹配:图中包含边数最多的匹配称为图的最大匹配。原创 2013-01-01 22:10:29 · 9895 阅读 · 0 评论 -
有上下界网络流问题
有上下界网络流问题http://hi.baidu.com/newfarking/item/b9780317201c9651f0090e641.无源汇最大流2.有源汇最大流3.有源汇最小流1.无源汇最大流问题sgu194题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去转载 2014-04-18 10:06:58 · 740 阅读 · 0 评论 -
hdoj 4828 卡特兰数取模
GridsTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 93 Accepted Submission(s): 25Problem Description 度度熊最近很喜欢玩游戏。这一天他在纸上画了原创 2014-05-24 21:58:06 · 2034 阅读 · 0 评论 -
PAT 1066 平衡树
#include#include#include#include#include#includeusing namespace std;#define Max(x,y) ((x)>(y)?(x):(y))#define ABS(x) ((x)>0?(x):-(x))struct Node{ Node* l,*r; int val,h; Node(int x){ l=r=原创 2014-08-29 16:19:47 · 961 阅读 · 0 评论 -
[LeetCode]Palindrome Partitioning 找出所有可能的回文组合
给定一个串,分割该串,使得每个子串都是回文串。找出所有可能的组合。方法:暴搜+回溯class Solution {public: int *b,n; vector >ans; void dfs(int id,string &s,int len){ if(id>=n){ if(len>0){ vectorvt; vt.push_back(s.substr(0原创 2014-11-09 10:51:57 · 1525 阅读 · 0 评论 -
[LeetCode]Word Break 字典树
题意:判断一个串是否可由给定字典中的串构成。为了判断目标串中与所有字典匹配,需要判断目标串中每一个前缀开始往后是否匹配,这就需要枚举目标串成功匹配的所有前缀。class TrieNode{//from http://www.cnblogs.com/x1957/p/3492926.htmlpublic: TrieNode* ch[26];//char指针数组 boo原创 2014-11-05 16:12:11 · 1919 阅读 · 0 评论 -
[LeetCode]Jump Game II (贪心,维护当前最远能到达的位置和所需最少步数)
最少跳跃步数第一想法是DP,复杂度O(n^2),但是对于大型数据会超时。Discuss中一种犀利的贪心方法,复杂度为O(n)class Solution {public: int jumpDP(int A[], int n) {//DP方法 int *dp=new int[n],j; memset(dp,127,sizeof(int)*n); dp[0原创 2014-11-09 17:36:21 · 4752 阅读 · 0 评论 -
AES加密
import com.sun.crypto.provider.*;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.UnsupportedEncodingException;import java.security.InvalidAlgorithmPara原创 2015-03-03 14:17:28 · 4211 阅读 · 0 评论