自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

durong123123123的专栏

毕业时要拿到Facebook Offer哦

  • 博客(191)
  • 收藏
  • 关注

原创 利用后缀数组加速字符串搜索

我们比较常听到的字符串搜索算法如KMP,BM算法等,其算法均含有利用后缀数组进行字符串加速的想法。这里考虑一个比较单纯的利用后缀数组找出出现次数多于1次的最长子字符串,例子来自《编程珠玑》,具体解释可以参看书。关键思想是为文本进行预处理,从而得到其后缀数组表达形式,然后排序后比较相邻后缀即可得出出现次数多于1次的最长子字符串。#include#include#include#incl

2015-04-01 16:23:36 605

原创 找出n个数中最大的m个数的一些解决办法

方法1:排序后直接选出,这样时间开销为O(NlogN)方法2:先用选第k大元素的方法选出第k大元素(具体可以参考选第k大元素的那篇BLOG),按Knuth的说法,时间开销是O(n),这样的话,如果我们找到第n-m大的元素,设其为a,然后顺序扫描一遍原序列,即可以得到最大的m个数,这样做的前提是序列中没有重复元素。时间开销为O(n)方法3:构建一个m元最小堆,然后依次比较后续元素

2015-04-01 10:33:39 4184

原创 堆排序实现

堆排序可以保证最坏情况下的效率边界为O(nlogn)。如果直接用c++的priority_queue作为辅助结构来实现堆排序,会消耗额外O(n)的存储空间。我们可以直接在原数组上进行堆排序从而节省O(n)的空间开销。代码如下,利用了c的rand函数来实现随机输入。#include#include#includeusing namespace std;const int MAXN=

2015-04-01 09:56:01 500

原创 递归实现有序链表(不需要使用两个指针)

在使用有序链表作为基本数据结构时,当插入数据时,为了保持链表的有序性,我们需要两个指针来定位插入位置。通过递归我们可以巧妙的实现不要两个指针的做法。// SortedSingleList.cpp : Defines the entry point for the console application.//#include "stdafx.h"/*在单链表中有序插入元素时,一般使

2015-03-30 09:56:30 682

原创 快速排序的一些实现技巧(曾经被手写快排打倒过n+1次。。。)

首先是一个最简单的版本,与常见的双向扫描相比,这个只需要单向扫描即可,不容易出错,推荐手写时优先选择。m位置左侧包括m位置本身,是小于分割元素的,m位置右侧位置,是大于等于分割元素的。#includeusing namespace std;void qsort(int l,int r,int a[]){ if(l>=r) { return; }

2015-03-28 10:26:02 1696

原创 编写日历程序的注意事项

由于每一年开始的第一天总共只有7种可能(星期一至星期天),每一年只可能存在两种状态(闰年,平年),所以总共有7*2=14种可能,所以“基础”日历只有14种,这样在编写任意一年的日历时,只要保存对应“基础”日历的索引号即可。注:本想法来自《编程珠玑》

2015-03-26 11:01:35 537

原创 c++高效实现isupper,islower,isnum,isalpha的做法

看到《编程珠玑》代码调优一章,讲到了许多调优的细节,其中就讲到了如何高效实现这一组字符判断函数,关键是以空间换时间,进行缓存,以及通过位运算加速。下面是我的一个实现,使用到了函数对象。#include#includeusing namespace std;class Isalphanum{ public: char buffer[256];

2015-03-26 09:05:44 3060 1

原创 c++中如何访问数组的-1位置

今天在《编程珠玑》上看到的一个trick,如何访问数组的-1位置。其实这算是一种炫技的做法,现实中应该没有人会这样来写的吧?#includeusing namespace std;int main(){ int a[]={1,2,3,4,5}; int *b=a+1; for(int i=-1;i<5-1;++i) { cout<<

2015-03-24 11:03:43 954

转载 Boyer-Moore algorithm

参考给出的地址,说得比较详细http://blog.jobbole.com/52830/

2015-03-21 11:04:58 442

原创 hihoCoder 1043 完全背包

可以直接在0-1背包的基础上进行扩展,得到一个比较naive的解法// hiho1043.cpp : Defines the entry point for the console application.//#include#include#include#include//#define DEBUGusing namespace std;int main(){#i

2015-03-20 19:23:06 371

原创 hihoCoder 1038 01背包

最经典的动态规划题目,注意这里将二维数组压缩成了一维数组来进行计算// hiho1038.cpp : Defines the entry point for the console application.//#include#include#include#include//#define DEBUGusing namespace std;int main(){#if

2015-03-20 18:37:54 341

原创 hihoCoder 二分·二分查找之k小数

与之前二分查找一个数是否在序列中道理是一样的// hiho37week.cpp : Defines the entry point for the console application.//#include#include#include//#define DEBUGusing namespace std; int findK(int start, int end, in

2015-03-20 15:53:27 828

原创 hihoCoder 1128 二分·二分查找

二分查找适用于“有序”的情况,即一次能排除一半备选答案。在本题中,当数列无序时,我们不能直接利用二分查找,但是,我们可以利用求第k小数的思路,即用partition一次排除一半。这里的partition同quick-sort中的partition是一样的,原理很简单,但实现起来要注意细节,比如指针的推进,元素的交换。#include#include#include#include//#

2015-03-20 10:40:59 614

原创 Python实现的一些常用日期函数

以下是一些常用的日期函数的实现,每个函数开头的注释中说明了函数的作用,问题的出处可以参考《编程珠玑》第三章练习题4def leapYear(year): """ decide whether year is leap year. for exmaple: 1900, not leap year 2000,leap year 2004,leap y

2015-03-19 12:23:45 496

原创 leetcode刷题总结

截止2015.03.15,leetcode上总共有算法题181道,其中9道题需要买书才能查看,所以有效题目数量为172道。我已全部解决这172道问题,现将这段时间的刷题过程总结如下,mark一下这个小小的成就^_^占个位置,有空再写。

2015-03-15 19:16:59 303

原创 Best Time to Buy and Sell Stock IV

首先要想到的是利用动态规划来解DP[i][j]代表的是截止第j天,最多进行i次交易所能获得的最大利润,这样最终DP[k][n-1]便是所求答案。值得注意的是,leetcode上对这道题的测试在k的取值上有一点trick。如果直接进行动态规划,会发现由于k过大而产生 Runtime Error 或者 MLE,关键在于要意识到如果k是大于n/2,那么意味着可以进行最优的交易过程,即每当第二天价格比

2015-03-15 19:11:01 297

原创 Largest Number

这道题的关键在于找到一个巧妙的比较函数。在论坛里看到某位大神的经典之作,代码如下:class Solution {public: string largestNumber(vector &num) { vector arr; for(auto i:num) arr.push_back(to_string(i));

2015-03-14 10:04:37 305

原创 Binary Search Tree Iterator

这道题目表述的不太好,容易造成误解,我就误解了2次。。。“next smallest number”其实指的就是树中的最小元素,所以说白了就是每次都返回最小元素即可。所以一个很直觉的解法就是:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; *

2015-03-13 18:16:14 344

原创 Repeated DNA Sequences

这道题如果直接用map来存储子字符串的话会MLE,需要通过将子字符串转成hash只存储从而节省存储空间。值得注意的一个技巧是,为了避免重复加入元素,我们只有在map中计数为2时才将其加入结果中,这样结果中就不会出现重复元素了。论坛里大神给出的解决方案如下:class Solution {public: vector findRepeatedDnaSequences(strin

2015-03-13 13:47:42 304

原创 Pattern Recognition and Machine Learning 读书总结(持续更新中)

花费了20天左右的时间浏览了一遍这部大块头,说说感受吧。

2015-03-12 16:46:04 758

原创 Factorial Trailing Zeroes

这是一道考验数学理解的题,论坛里有详细的分析:https://leetcode.com/discuss/19847/simple-c-c-solution-with-detailed-explaination 代码如下:class Solution {public: int trailingZeroes(int n) { int res=0;

2015-03-12 13:43:46 276

原创 Excel Sheet Column Number

简单题:class Solution {public: int titleToNumber(string s) { int n=s.size(); int res=0; int base=1; for(int i=n-1;i>=0;--i) { res+=(s[i]-'A'+1)*

2015-03-12 12:36:12 275

原创 Majority Element

这道题有多重解法,在solution里有很清楚的解释,如下:Runtime: O(n2) — Brute force solution: Check each element if it is the majority element.Runtime: O(n), Space: O(n) — Hash table: Maintain a hash table of the counts of

2015-03-12 11:21:53 293

原创 Rotate Array

最直觉的解法:缓存需要移动到原数组开头的元素。注意当循环移动n位时,相当于没有移动,所以k%n即可。class Solution {public: void rotate(int nums[], int n, int k) { int nk=k%n; if(nk==0) { return; }

2015-03-11 10:31:49 269

原创 Reverse Bits

最直觉的解法:class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t res=0; int pos=31; while(n) { int tmp=n%2; if(tmp==1)

2015-03-11 10:21:06 372

原创 Number of 1 Bits

class Solution {public: int hammingWeight(uint32_t n) { int cnt=0; while(n) { int tmp=n%2; n/=2; if(tmp==1) {

2015-03-11 09:49:21 317

原创 The Elements of Statistical Learning 读书总结(持续更新中)

第一遍读书总结 2015.02.23 :学长推荐的这本书,花了10天左右通读了一遍,由于之前看过点修炼“外功”的书和视频(programming collective intelligence、machine learning in action,以及coursera上stanford的PGM和NLP的视频,Ng的machine learning没能看下去,不太爱听Ng的发音),所以对这方面的

2015-02-23 17:45:34 2482

原创 Dungeon Game

这道题试了好久,始终在动态规划时无法保证局部最优解是全局最优解的一部分,很恼人。后来参考了论坛大神的代码,unlock了solution,总算是搞明白了究竟是怎么回事儿。贴上Leetcode的解析供大家学习:At first glance, this problem bears a large resemblance to the "Maximum/Minimum Path

2015-02-11 16:43:03 312

原创 Excel Sheet Column Title

简单题,想清楚即可,注意每层计数时还要把之前层已经算过的加进来。class Solution {public: string convertToTitle(int n) { int exp=1; long tmp=26; while(tmp<n) { tmp=tmp*26+tmp;

2015-02-10 22:46:47 236

原创 Maximum Gap

这道题首先一定要有“排序”的思想,但是常用的排序算法复杂度至少是O(NlogN),不满足题意。进一步思考可以得出,这里的“排序”不一定非要“完整排序”,可以只要“部分排序”即可,这可以想到桶排序,只要意识到了桶排序,这道题就解决了一大半。由于平时桶排序思路接触的比较少,还是在unlock了solution后根据给出的提示才解出来。提示如下:Suppose there are N

2015-02-10 17:07:15 352

原创 MongoDB文档学习笔记(持续更新中)

MongoDB will not permanently create a database until you insert data into that database. MongoDB will create a collection implicitly upon its first use. You do not need to create a collection be

2015-02-10 16:51:12 323

原创 Compare Version Numbers

只需要注意一种特殊情况:类似“1.0”与“1”的这种特殊情况。虽然前一个更长,但它们是相等的。class Solution {public: int stringToInt(const string& s) { int res=0; for(int i=0;i<s.size();++i) { re

2015-02-10 13:22:07 257

原创 Find Minimum in Rotated Sorted Array II

与Find Minimum in Rotated Sorted Array类似,只是在num[0]==num[n-1]时需要注意,这时不能根据num[n-1]的值来将数列一分为二。需要首先从数列头开始扫描,直到找到不等于数列头的元素,这时就可以退化为Find Minimum in Rotated Sorted Array来解决class Solution {public: i

2015-02-10 12:30:56 203

原创 Find Minimum in Rotated Sorted Array

没啥说的,因为没有重复元素,所以很容易判断数列有没有旋转。如果旋转了,也很容易找出发生旋转的位置class Solution {public: int upperBound(int start,int end,int val,const vector& num) { while(start<end) { int mi

2015-02-09 11:53:51 206

原创 Find Peak Element

O(n)时间复杂度的naive解法也可以AC,但题目要求O(logN)时间复杂度,说明测试用例并不严格。O(N)解法:class Solution {public: int findPeakElement(const vector &num) { int n=num.size(); if(n==0) { re

2015-02-09 10:21:57 188

原创 Intersection of Two Linked Lists

时间复杂度为O(n^2)或者空间复杂度为O(n)的解法很容易想到,但都不满足题目要求。我的解法的基本思路是,得到两个list的长度,顺便比较它们的结尾,如果结尾不相同,则两个list肯定不相交。否则将两个list的长度对齐,然后同时向前齐步走,如果它们相遇了,那么相遇的节点即为相交节点。/** * Definition for singly-linked list. * struct

2015-02-09 09:49:21 279

原创 Min Stack

第一反应是实现一个优先队列,这样可以在O(1)的时间内找到最小值,但这并不是题目想要的答案,题目只需要一个stack,其附加功能是能在O(1)内找到最小值,如果用优先队列则无法保证stack的性质。实现优先队列的代码如下:class MinStack {public: vector heap; int sz; MinStack():sz(0){} bool empt

2015-02-08 22:07:09 211

原创 Maximum Product Subarray

本题难点在于不但要动态规划最大值,还要动态规划最小值,因为最小值如果乘以一个负数,有可能变成最大值。我没有意识到记录最小值这件事情,所以一直纠结在最大值上,后来用比较讨巧的brute-force的方法勉强AC通过(压缩连续的1为一个1),参考了unlock的solution,终于知道了要如何解决问题,代码如下:class Solution {public: int max(int

2015-02-08 15:11:14 352

原创 Reverse Words in a String

我利用了额外的存储空间(栈)使得问题简单化,也可以直接在原string上做,但要记录当前待处理的string的长度,并及时将已经处理过的string从原string中删除class Solution {public: void reverseWords(string &s) { stack stk; int wordCnt=0;

2015-02-08 10:28:31 242

原创 Evaluate Reverse Polish Notation

只要注意操作数可能为负数的情况即可class Solution {public: int stringToInt(string s) { int res=0; int i=0; bool negative=false; if(s[i]=='-') { negativ

2015-02-08 09:49:23 256

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除