- 博客(61)
- 资源 (7)
- 收藏
- 关注
原创 376. Wiggle Subsequence
线性解法:定义up[i]表示从0到i组成最长的wiggle序列,并且序列的最后两个元素a,b的差是正的,即a<b;同理down[i]表示从0到i组成的最长wiggle序列,并且序列最后的两个元素a和b的差是负的,即a>b;状态转移方程:up[i] = down[i-1]+1 (nums[i]>nums[i-1]) up[i-1] (...
2019-05-19 23:27:08 205
原创 1044. Longest Duplicate Substring
题目大意:给定一个字符串,长度为n(n<=100000),求所有的子串中,子串出现次数大于等于2的最长子串。n=10^5级别,暴力解法肯定过不了。解法一: 二分答案+Rabin-Carp两个问题需要解决:1. 如何快速计算子串长度;2. 如何快速比较相同子串是否相等第一个问题,可以采用二分的思想,如果不存在长度为k的冗余子串,也不可能存在长度大于k的冗余子串,如果存在长度...
2019-05-15 10:38:35 1124
原创 Best Time to Buy and Sell Stock系列问题
Best Time to Buy and Sell Stock只允许买一次,我们知道卖肯定在买之前,所以只要在考虑要不要卖之前,知道了前面天数的股票最低价就可以得到这一天卖的最大获利:时间复杂度O(n) 空间复杂度O(1)class Solution {public: int maxProfit(vector<int>& prices) { i...
2019-04-05 23:29:17 227
原创 红黑树的c++ 实现
红黑树,这个算法导论上有算法流程的介绍,这里简单实现了一下。不同于avl树,红黑树黑色叶子节点还是很有用,在处理删除操作时,多了null的叶子节点,算法写起来顺很多,因为有可能删除了节点之后,调整是从黑色的叶子节点开始的。#ifndef __RBTREE_H__#define __RBTREE_H__#include <vector>#define RBTREE_NOD...
2019-04-05 14:51:17 153
原创 AVL树的c++实现
作为最古老的平衡排序二叉树,avl树算是比较经典了,闲着无聊,也自己实现一下,实现了插入和删除操作。avl树的特点: 1. 排序二叉树; 2. 左右子树高度差小于等于1;具体算法流程伪代码随便找一下都会有的,插入也没啥难度,就是判断树高是否发生变化,需要时进行旋转;删除操作节点,然后转移到删除至多只有一个儿子的节点上,根据树高特点进行旋转;删除和插入不同的一点,...
2019-04-05 14:16:05 209
原创 Redis锁的介绍
Redis锁的实现:由于Redis是单进程的,可以简单用setnx这个命令进行加锁操作,谁能操作成功,谁就可以获得锁。简单的代码如下:def acquire_lock(): # identifier: 唯一标识客户端 # lockname 锁名字 # redis 客户端连接 if redis.setnx(lockname, identifier): ...
2018-08-20 18:24:02 2505 2
原创 Redis之字典
Redis的字典的底层实现是用哈希表。/* This is our hash table structure. Every dictionary has two of this as we * implement incremental rehashing, for the old to the new table. */typedef struct dictht { dictEntry *...
2018-06-23 22:35:00 199
原创 redis中SDS实现
sds(simple dynamic string)是Redis自己构建的字符串,作为Redis默认的字符串表示。/* * 类型别名,用于指向 sdshdr 的 buf 属性 */typedef char *sds;/* * 保存字符串对象的结构 */struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 ...
2018-06-23 09:18:40 973
原创 Exam Room leetcode
In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1.When a student enters the room, they must sit in the seat that maximizes the distance to the closest person. If there ar...
2018-06-18 17:19:43 603
原创 leetcode Russian Doll Envelopes
题目要求用大信封装小信封,问最多可以这样嵌套多少个。最简单的做法就是动态规划,01背包问题,把数组排序,先按第一个元素排序,再按第二个元素排序。dp[i]表示以i作为最大信封,0-i个信封,最多装多少个。问题没有后续性,时间复杂度O(n^2)然而如果我们对第二个元素排序时按从大到小排序,这时候有个神奇的东西诞生了。问题等价于求LIS(最长上升子序列的长度),倒序第二个元素是为了排除第一
2016-07-18 20:36:52 538
原创 常见几种二分查找
二分查找经典的算法很简单,基本注意下循环终止条件和计算中间值mid坐标时注意一下溢出问题,就可以了。下面给出根据二分查找变形求一些特殊值的算法。有问题烦请值证。// 经典二分查找int binary_search( int a[], int n, int value ){if( n == 0 )return -1;int low = 0, high = n - 1;whil
2016-07-12 15:21:14 469
原创 leetcode Scramble String
递归调用子问题。每次分成子问题处理,注意子问题不能为空。class Solution {public: bool isScramble(string s1, string s2) { const int n1 = s1.size(); const int n2 = s2.size(); if(n1!=n2)return fal
2013-12-19 10:47:41 791
原创 leetcode Validate Binary Search Tree
中序遍历得到所有的顺序之后只需要比较相邻的两个结点是否有序就可以了!/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NU
2013-12-18 20:44:30 589
原创 leetcode Longest Valid Parentheses O(n)解法
模拟栈的工作进栈和出站的过程,一对括号如果能匹配,意味着左括号的下标到右括号的下标的这段括号都能匹配,所以只需要模拟一遍就够了!!!用个数组记录那些可以匹配的区间,然后线性扫一遍就可以得到最长的区间了。每个元素最多进栈一次,出栈一次,线性扫描只需要一遍,所以时间复杂度为O(n),空间复杂度也是O(n)class Solution {public: int longestVal
2013-12-16 14:21:43 841
原创 leetcode Trapping Rain Water
做法就是维护一个非严格递减,遇到不递减的高度,就不断地往栈中弹出元素直到栈顶元素的高度比这个大为止或者栈为空,如果栈为空,那么证明这一段的容量就可以计算出来了,如果栈不为空,那么从栈顶位置到当前位置的容量可以用这个两个高度的较低者水的水平线。我们可以把道题看成有几个容器,我们来确定容器的两个侧边。如果左侧边比右侧边小,那么这一段容量就可以求了,因为如果后面遇到更比右侧边更大的边不会影响这个的结
2013-12-12 15:14:18 775
原创 leetcode word break
正常的搜索,加个数组dp[i]判断从i这个位置到结尾能否刚好划成几个词,class Solution {public: vector wordBreak(string s, unordered_set &dict) { // Note: The Solution object is instantiated only once and is reused by
2013-12-12 09:48:27 714
原创 leetcode Maximal Rectangle
题目要求:给定一个矩阵,元素只有0和1,求一个面积最大的矩形! ///思路一:看成是每一行向上可以延伸到多远,然后求以这个为底边的一个最大矩形,就是一个单调栈问题了! /////思路二:预处理height[i][j]数组表示向上i,j可以到达多远,left[i][j]表示height[i][j]这条线段向左可以 ////到达多远,right表示
2013-12-11 18:19:34 775
原创 Leetcode Search for a Range
class Solution {public: vector searchRange(int A[], int n, int target) { int low = binarylow(A,n,target); vector ans; ans.push_back(low); low = binary(A,n,ta
2013-12-08 15:31:41 718
原创 leetcode Word Ladder II
先用bfs得出最短路径长度,在bfs过程中,可以得到每一层有多少个结点可以到达,也就是在最短走k步的情况下,到达的结点,这样待会在求所有路径的时候就可以剪枝。。。vector edge[1000000];set censhu[10000];class Solution {public: vector > findLadders(string start, string
2013-11-25 10:16:46 742
原创 leetcode Substring with Concatenation of All Words
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 conca
2013-11-24 21:01:37 1095
原创 Linked List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return nullFollow up:Can you solve it without using extra space?给定一个链表的头指针,问你能不能只用常数的空间快速判断一个链表是不是有环,如果有环
2013-11-11 20:23:37 9086 10
原创 算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。对于给定的N,我们可以用筛法求素素数的方法在O(n)的时间复杂度内求出所有的素数。然后如何求给定的[6,N]内的数字内的偶数是由两个素数[6,N]组成的呢。记得数学上有这样一个猜想:哥德巴赫猜想任一大于2的偶数,都可表示成两个素数之和所以6到N内的所有偶数都是由两个奇素数相加得到的(素数只有一
2013-10-14 14:19:12 4396 8
原创 poj 2828 Buy Tickets
题目的意思是给出一些人插队的顺序,求出最后插完的队列结果可以用反向推到的方法,最后一个插入的点,前面有pos[n-1]个座位,以此类推可以想到用线段树的方法记录一个线段的座位的个数,不断地更新线段树顺便介绍一个线段树的文章:http://www.notonlysuccess.com/index.php/segment-tree-complete/#include#include
2013-06-05 00:50:07 624
原创 sicily 7973. Hot Dogs in Manhattan
先BFS记录,然后从大到小枚举点,维护最大的曼哈顿距离,具体做法就是维护x+y x-y的最大值和最小值 四个数新加入的点与之前点的最大值就是MAX(x1+y1)-(x-y)的最大值,x-y同理#include #include #include #include #include using namespace std;struct node{int x;i
2013-04-20 01:27:04 706
原创 7967. Book Stack
本题的意思就是给你一些不同大小的书,从上往下排列好,给定的排序操作就是选取一本书放在顶部,但是取出来的这本书的上面的书必须是递增的(可以使不严格递增)。然后问总共需要的移动次数。仔细观察,排序的思路是固定的,对于已经是单调的堆,我们不可能去取其中的一本去放在堆顶。因为假设取了一本之后,你会发现还是需要把它放在原来的位置才能继续下面的操作。所以,基本上是每次取单调的最大堆的下个比堆底元素小的元素,把
2013-04-19 01:23:42 777
原创 划分树 poj 2104
划分树划分树的定义 它的每一个节点保存区间[lft, rht]所有元素,元素排列顺序与原数组(输入)相同,但是,两个子树的元素为该节点所有元素排序后 rht−lft +1 / 2个进入左子树,其余的到右子树,同时维护一个num域,num[i] 表示lft 到i这些点有多少进入了左子树。数据结构int Sort[M];//排完序的数组,便于后面查找一段线段的最中间的数stru
2013-01-21 01:45:12 492
原创 poj 1042Gone Fishing
贪心算法+枚举枚举最远到达那个湖i,先把总时间减去走到湖i的时间,剩下的可以看做在i个湖里每次拿一个最大的,用了一个自定义的堆结构#include#include#include#includeusing namespace std;struct node{int num;int loca;node(int nn = 0,int ll = 0){num
2012-10-17 09:14:22 513
转载 十个利用矩阵乘法解决的经典题目
转载的,好东西!!!好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人,今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中,一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前
2012-05-09 02:03:56 518
原创 3065 病毒侵袭持续中
#include#include#include#include#includeusing namespace std;struct node{node * next[26];node* fail;int count;node(){count = -1;fail = NULL;memset(next,NULL,sizeof(next));}
2012-05-08 10:59:23 418
原创 2896
病毒侵袭Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4441 Accepted Submission(s): 1138Problem Description当太阳的光辉逐渐被月亮遮蔽,世界失去了光明
2012-05-07 21:13:10 1084
原创 自动机 Keywords Search 2222
主要考裸的AC自动机,这个东西之前看了,现在基本忘记了。。主要记住里面的fail指针的妙用#include#include#include#include#includeusing namespace std;struct node{node *next[26];int count;node *fail;node(){memset(next,NULL
2012-05-07 00:36:33 464
原创 poj 1195
第一次写二维树状数组,纪念一下#include#include#include#includeusing namespace std;long long c[1025][1025];int s;int lowbit(int i){return (i&(-i));}void update(int x,int y,long long val){for
2012-04-23 23:35:03 389
原创 poj 3321 apple tree
数组数组以及树形转线性#include#include#includeusing namespace std;const int maxn = 210000;int c[maxn];int head[maxn];int nxt[maxn];int e[maxn];int tot = 1;int n;int fir[maxn];int last[m
2012-04-23 19:12:36 398
原创 poj 1743 Musical Theme
主要是使用后缀数组,参考《后缀数组----处理字符串的有力工具》sa[i]表示排名第i的后缀是哪个可以得到height[i]数组:表示sa[i]和sa[i-1]的子串的最大长度。然后怎么找到最大的解呢,首先就是二分答案k,然后按照顺序按照hight[i]>=k分组,每一组里面j个height里面总共j+1个sa,如果里面最小和最大的差>=k,那么就找到了长度为k并且不重叠的公共字符串。
2012-04-21 03:47:39 449
原创 sicily 1023. Funny Contest
很久之前做了,但是弄了好久才弄懂,现在看一下后缀数组又懵了。。。我弱爆了。。题目就是按照后缀数组的倍增算法,因为倍增算法用倍增算法排序后,刚好可以统计这次得到的名次。不过原始的后缀数组不是一个循环的字符串,我们把它改成循环就行了#include#include#include#includeusing namespace std;const int maxn
2012-04-20 12:26:16 572
原创 poj 1698 二分图的匹配
简单的建图,X部是每部电影需要的天数之和,Y部是时间,建立二分图,然后就是匈牙利了。。。因为一开始乱初始化。。。match要-1的,我是从0开始计数的。。。Wa了超久。、。。。郁闷#include#include#includeusing namespace std;const int MAXN = 51*51;const int MAXM = 51*51;bool m
2012-04-19 22:56:29 417
原创 09CS
在犹犹豫豫中,我还是去参加篮球赛了。哈哈、之前的不愉快我尽量的在忘记,大家都是性情中人,我能理解,只是之前的事,我很不开心。但是看到大家还是记得叫我,我被感动了,我要去帮助CS取胜。。。最后虽然败了,但是我没有遗憾。只可惜大家真的配合太少,如果一打一,绝对打爆对面,但是1+1<2,只能多多配合。LT作为核心人物,打得很好,就是没有怎么协调好队员的轮换,CF作为队长,尽责尽力,打得拼赞一个;JT个人
2012-04-10 02:24:55 369
原创 poj 3368 Frequent values(线段树+离散化) -
第一步就死离散化,现在才开始接触。。乃琦神牛要我一定要做几题,我也就试试罗。对于相同的数,记录起点和终点,记录出现的次数,缩成一个点。就可以建线段树。还要注意如果给出的点不是起点,那么这个点连续的一段相同的要先算出来。。而且这道题没有动态变化。个人觉得RMQ一样可以过。。。。下次有空试一下。不过正在学线段树,就做一下线段树的吧。#include#include#incl
2012-04-09 02:46:05 443
原创 sicily 1225. 电子眼
/////图其实是一个树加了一条边,我们找到这个环,然后枚举其中一条边的两端,看是在哪里安装电子眼。剩下的就是普通的树形dp了。。#include#include#include#includeusing namespace std;const int MAXN = 101000;vector g[MAXN];int p1,p2;////准备删除的边int d
2012-03-21 17:10:36 650
原创 poj 2516 Minimum Cost KM算法 最小权值匹配
一开始想到了就是拆点,题目说每个人对每种goods的需求都是只有0-3,我是从这个想到的。。。接下来就是建立模型拉。然后就是KM算法。。#include#include#include#includeusing namespace std;int shop[51][51];int store[51][51];int cost[51][51][51];
2012-03-16 12:02:15 1511
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人