算法
文章平均质量分 61
cocolalala
这个作者很懒,什么都没留下…
展开
-
树状数组
树状数组是对一个数组改变某个元素和求和比较实用的数据结构。两中操作都是O(logn)。 在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。 但是不难发现,如果我们修改了任意一个A[i],S[i]、S[i+1]...S[n]都会发生变化。 可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需转载 2014-07-16 10:55:37 · 260 阅读 · 0 评论 -
[leetcode] Bitwise AND of Numbers Range
简单题,当m和n不相等时,即区间内必存在奇偶数,故低位AND后取0,故结果为m和n从高位开始取相等的那些位得到的值。代码如下:int rangeBitwiseAnd(int m, int n) { int p = 0; while(m != n && m != 0){ ++p; m >>= 1;原创 2015-04-20 21:47:14 · 343 阅读 · 0 评论 -
[leetcode] Implement Trie (Prefix Tree)
实现字典树基本功能,包括查找key和前缀。代码如下:class TrieNode {public: // Initialize your data structure here. TrieNode() { for(int i = 0; i < 26; ++i) next[i] = NULL; end = false;原创 2015-05-08 13:59:16 · 268 阅读 · 0 评论 -
[leetcode] Isomorphic Strings
简单题,map记录下即可~代码如下:bool isIsomorphic(string s, string t) { if(s.length() != t.length()) return false; unordered_map mp1; unordered_map mp2; for(int i = 0;原创 2015-04-30 15:29:48 · 425 阅读 · 0 评论 -
[leetcode] Course Schedule II
和Course Schedule类似,记录下结果即可。代码如下:vector findOrder(int numCourses, vector>& prerequisites) { vector result; vector into(numCourses, 0); for(int i = 0; i < prerequisites.size();原创 2015-05-15 14:41:10 · 289 阅读 · 0 评论 -
[leetcode] Course Schedule
图算法,判断有向图是否存在回路。拓扑排序即可,代码如下:bool canFinish(int numCourses, vector>& prerequisites) { vector into(numCourses, 0); for(int i = 0; i < prerequisites.size(); ++i) into[prereq原创 2015-05-07 14:52:21 · 701 阅读 · 0 评论 -
[leetcode] Reverse Linked List
链表简单题,遍历头插法即可。代码如下:ListNode* reverseList(ListNode* head) { if(!head) return head; ListNode dummy(-1); dummy.next = head; ListNode *cur = head; Lis原创 2015-05-07 14:56:48 · 294 阅读 · 0 评论 -
[leetcode] Combination Sum III
简单题,和前面两个类似。代码如下:class Solution {public: vector> combinationSum3(int k, int n) { vector > result; vector num; dfs(k, n, result, num, 1); return result; }pri原创 2015-06-03 15:49:24 · 1102 阅读 · 0 评论 -
[leetcode] Maximal Square
动态规划,dp[i][j]代表以i,j为右下角的正方形的最长边长。代码如下:int maximalSquare(vector>& matrix) { int result = 0; if(matrix.empty()) return result; const int n = matrix.size();原创 2015-06-03 16:40:36 · 1183 阅读 · 0 评论 -
[leetcode] Word Search II
直接用word search暴力果断超时,根据提示可对words先构建字典树,然后dfs。代码如下:class TrieNode {public: // Initialize your data structure here. TrieNode() { for(int i = 0; i < 26; ++i) next[i] = NULL原创 2015-05-23 17:27:48 · 780 阅读 · 0 评论 -
[leetcode] House Robber II
和I类似,II变成了环形,即首尾只能取一个。调用两次即可。代码如下:int rob(vector& nums) { if(nums.empty()) return 0; if(nums.size() == 1) return nums[0]; int val = *prev(nums.end());原创 2015-05-23 18:40:53 · 308 阅读 · 0 评论 -
[leetcode] Word Search
dfs,代码如下:class Solution {public: bool exist(vector > &board, string word) { const int row = board.size(); const int column = board[0].size(); vector > visited(row, vecto原创 2015-05-23 17:28:29 · 351 阅读 · 0 评论 -
[leetcode] Add and Search Word - Data structure design
字典树,代码如下:class TrieNode {public: // Initialize your data structure here. TrieNode() { for(int i = 0; i < 26; ++i) next[i] = NULL; end = false; } void ins原创 2015-05-23 17:46:31 · 424 阅读 · 0 评论 -
[leetcode] Invert Binary Tree
和最近比较火的一条Twitter相关,题目本身其实并不难...递归和非递归代码如下:/*if(!root) return root; TreeNode* lf = root->left; root->left = invertTree(root->right); root->right = invertTree(lf);原创 2015-06-14 15:18:48 · 396 阅读 · 0 评论 -
[leetcode] Self Crossing
class Solution {public: bool isSelfCrossing(vector& x) { /*solution 1: only in three cases when cross /* i-2 case 1 : i-1┌─┐ └─┼─原创 2016-03-18 15:13:38 · 300 阅读 · 0 评论 -
[leetcode] Word Pattern
注意一一对应即可:class Solution {public: bool wordPattern(string pattern, string str) { int i = -1, pos = 0; unordered_map mp; unordered_set st; while(++i < pattern.leng原创 2016-03-19 00:15:05 · 358 阅读 · 0 评论 -
[leetcode] Single Number III
同Single Number,异或后按照得到的结果中bit位为1的将数组分为两组,结果必然各存在于这两组中,分别异或得到结果。代码如下:vector singleNumber(vector& nums) { int tmp = 0; vector result(2, 0); for(auto num : nums) { t原创 2016-03-21 15:01:48 · 298 阅读 · 0 评论 -
[leetcode] Number of Islands
BFS或DFS,利用grid数组来标记是否访问。代码如下:int numIslands(vector> &grid) { if(grid.empty()) return 0; const int m = grid.size(); const int n = grid[0].size(); int dir[4原创 2015-04-14 16:56:34 · 305 阅读 · 0 评论 -
[leetcode] House Robber
简单题,代码如下:int rob(vector &num) { if(num.empty()) return 0; int pre = 0, cur = num[0]; int result = cur; for(int i = 1; i < num.size(); ++i){ re原创 2015-04-07 22:07:30 · 258 阅读 · 0 评论 -
[leetcode] Binary Tree Right Side View
dfs,记录已经访问到的层数即可。代码如下:vector rightSideView(TreeNode *root) { vector result; int curLevel = 0, level = -1; dfs(result, curLevel, level, root); return result; }原创 2015-04-07 22:09:32 · 371 阅读 · 0 评论 -
拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。转载 2014-06-09 14:26:49 · 466 阅读 · 0 评论 -
2-sat问题
什么是2-sat问题?2-sat问题就是2判定问题,是一种特殊的逻辑panduanwen转载 2014-06-10 10:35:05 · 640 阅读 · 0 评论 -
tarjan算法
由Robert Tarjan发明的求有向图强连通分量的算法。转载 2014-06-09 15:09:51 · 340 阅读 · 0 评论 -
[leetcode] Longest Valid Parentheses
用栈,并改变匹配的括号在s中的位置的值为‘0’。最后统计连续0的geshu原创 2014-07-04 17:34:37 · 308 阅读 · 0 评论 -
[leetcode] Minimum Window Substring
代码如下:class Solution {public: string minWindow(string S, string T) { unordered_map count; unordered_map found; int index = 0, minLen = INT_MAX; int num = 0;原创 2014-07-04 16:42:25 · 468 阅读 · 0 评论 -
求最长回文子串
求最长回文子串,大概有以下几种方法:1、原创 2014-07-03 16:22:35 · 639 阅读 · 0 评论 -
Pattern Searching using a Trie of all Suffixes
以下是构造banana\0的后缀树:转载 2014-09-04 16:41:25 · 361 阅读 · 0 评论 -
c++手动和STL实现堆排序
好久没看最小堆和最大堆了原创 2014-07-02 17:08:02 · 1296 阅读 · 0 评论 -
[leetcode] Insert Interval
细节题,代码如下:原创 2014-11-13 13:42:46 · 284 阅读 · 0 评论 -
[leetcode] Merge Intervals
细节题,代码如下: bool comp(const Interval &a, const Interval &b){ if(a.start == b.start) return a.end < b.end; return a.start < b.start;}class Solution {public: vector me原创 2014-11-13 13:51:45 · 306 阅读 · 0 评论 -
最近点对问题
编程之美,最近点对问题(二维)。代码如下:原创 2014-10-16 14:58:58 · 422 阅读 · 0 评论 -
[leetcode] Compare Version Numbers
细节题,代码如下:int compareVersion(string version1, string version2) { int index1 = 0, index2 = 0; while(index1 < version1.length() || index2 < version2.length()){ int temp1, te原创 2014-12-17 09:56:15 · 404 阅读 · 0 评论 -
[leetcode] Fraction to Recurring Decimal
细节题,余数出现相同时即循环节。代码如下:string fractionToDecimal(int numerator, int denominator) { int flag = 1; long long lnum = numerator, lden = denominator; if(numerator < 0){ lnum =原创 2014-12-19 09:27:04 · 351 阅读 · 0 评论 -
[leetcode] Largest Number
bool cmp(const int &a, const int &b){ string sa = to_string(a); string sb = to_string(b); return sa + sb > sb + sa;}class Solution {public: string largestNumber(vector &num) {原创 2015-01-21 13:11:34 · 362 阅读 · 0 评论 -
砝码分块全称重问题
问题描述:一个M重的砝码,最少分成N块,使得所有1-M重的物品都可以用这N块砝码称出。分析:1、很容易想到二进制的方法,即每一块可以取也可以不取,即0和1,分类即1+2+4+...+2^(N-2)+X=M。 证明:由二进制可知1-(2^(N-1)-1)都可以称出,设现在需要称出2^(N-1)-1+Y的重量(Y可由前N-1个砝码中去除重量和为X-Y的砝码,加上第N个砝码后重量为原创 2015-03-03 10:36:01 · 500 阅读 · 0 评论 -
[leetcode] Dungeon Game
动态规划,代码如下:int calculateMinimumHP(vector > &dungeon) { const int m = dungeon.size(); const int n = dungeon[0].size(); int dp[m][n]; dp[m - 1][n - 1] = getMin(1 - dun原创 2015-01-09 15:21:54 · 634 阅读 · 0 评论 -
[leetcode] Happy Number
简单题,模拟并记录即可~代码如下:bool isHappy(int n) { unordered_set appear; while(n != 1){ appear.insert(n); int tmp = n; n = 0; while(tmp){原创 2015-04-22 11:01:31 · 290 阅读 · 0 评论 -
[leetcode] Combination Sum IV
思路:记忆化搜索,定义函数查找以index开始,值为target的个数,顺便对nums排序减少不必要的搜索。代码如下:class Solution {public: int combinationSum4(vector& nums, int target) { int result = 0; if(nums.empty() || target ==原创 2016-07-26 01:34:19 · 399 阅读 · 0 评论