数据结构与算法
hh1562535601
想多学点东西。
展开
-
由一道题所想到的
递归相对来说,实现简单,只要把递归公式和边界条件设置好就行了,语言本身的栈机制是比较容易实现递归的,然而性能上是不能令人满意的,这是非多项式复杂度算法,无论是时间还是空间。这道题的关键是,如果假设c[i]为爬到第i级台阶的方法数量,则c[i] = c[i-1] + c[i-2] (i>2); 而爬上第一级台阶明显只有一种方法,即c[1] = 1,爬上第二级台阶有两种方法:要么一级一级地爬,要么一次爬两级,因此c[2] = 2.因此这道题可以用迭代或动态规划(Dynamic Programming)来做,最根原创 2015-03-27 09:33:35 · 437 阅读 · 0 评论 -
trie树(字典树)
trie树原创 2015-05-18 16:22:26 · 326 阅读 · 0 评论 -
LeetCode——Word Break
class Solution {public: bool wordBreak(string s, unordered_set& wordDict) { int len = s.size(); if(len == 0) return false; set tmp; for(int i = 0; i < len; ++i) {原创 2015-07-09 15:11:34 · 305 阅读 · 0 评论 -
LeetCode——Count Complete Tree Nodes
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */clas原创 2015-07-09 15:07:44 · 424 阅读 · 0 评论 -
LeetCode——Linked List Cycle II
若同时从一个环的某个点出发,fast指针每次走两步,slow指针每次走一步,则可证明slow指针走回起点时,fast指针也恰好到达起点。两种思路:一、fast指针每次比slow指针多走一步,fast指针想与slow指针同时到达某点,必须超过slow指针一圈,每次多走一步,假设环的节点数为N,则多走一圈需要走N次,此时slow指针恰好走完一圈指向出发点,fast指针亦然;二、fast指针的速度是sl原创 2015-07-22 16:54:45 · 469 阅读 · 0 评论 -
LeetCode——Product of Array Except Self
本题要求是不使用额外空间,但保存输出结果的空间是必须要有的,此空间不计入空间复杂度,因而我们可以利用这部分空间存储中间结果。先看代码:class Solution {public: vector productExceptSelf(vector& nums) { vector output; int curren原创 2015-10-28 10:39:00 · 292 阅读 · 0 评论 -
hlist_head/hlist_node
这是Linux内核代码中常用的哈希链表的结构体定义。第一个结构体存放链表头指针,first指针指向一个由hlist_node节点组成的链表,声明一个struct hlist_head数组,每个元素都指向一条链表,就形成了一个哈希表中的很多哈希桶,类似于图的邻接表。struct hlist_node结构体中有前驱指针和后继指针,但不同于其他的数据结构,前驱指针并不是指向前一个节点,而是一个二级指原创 2015-10-26 22:38:48 · 737 阅读 · 0 评论 -
LeetCode——Single Number III
Single Number III和Single Number都可以用异或做,当然这题的难度要更大些。基本思想是,数组中仅有两个数只出现一次,如果我们能把这两个数分到两组,使每组除了一个数字只出现一次,其余数字都出现两次,则题目转换为Single Number。为了达到这个目的,需要用一个数来区分这两个数字。我们可以这样做:先把数组中所有的数异或,根据异或的性质,(n ^ a) ^ a ==原创 2015-10-27 17:12:25 · 344 阅读 · 0 评论 -
LeetCode——Single Number II
这道题有两种思路吧,一种是针对这道题的特定思路:class Solution {public: int singleNumber(int A[], int n) { int one=0, two=0, three=0; for(int i=0; i<n; i++){ two |= one&A[i]; on原创 2015-10-28 00:02:48 · 449 阅读 · 0 评论 -
LeetCode——Missing Number
这道题的思路是将其转化为Single Number那道题,将原数组与0...n这n+1个数合并成一个新数组,是不是就是Single Number这道题了?当然,本题要求常数空间复杂度,不必合成一个新数组,迭代计算就可以了。class Solution {public: int missingNumber(vector& nums) { int原创 2015-10-28 14:53:38 · 314 阅读 · 0 评论 -
LeetCode——Unique Path
想知道从某个格子出发到达目标格子有多少种不同的路径,就需要知道其右边的格子和下边的格子到达目标格子有多少种不同的路径,然后相加即得总的路径数。但要知道其右边的格子和下边的格子到达目标格子有多少种不同的路径,又要如此递归下去。为了简化计算,采用自底向上的思想,想到达右下角的格子,就要先到达这个格子的上边或左边,知道了这两个格子到达目标格子的不同路径数,其和就为同时与这两个格子相邻的那个格子到达目标格原创 2015-10-29 00:20:00 · 387 阅读 · 0 评论 -
LeetCode——Minimum Path Sum
这题和Unique Path条件一样,每次只能向右走一格或向下走一格,因此思路也差不多,只不过本题不是把这两格的值加起来,而是选取较小的值,因为要求最小值。class Solution {public: int minPathSum(vector>& grid) { int row = grid.size(), col = grid[0].size(原创 2015-10-29 23:59:17 · 289 阅读 · 0 评论 -
LeetCode——H-Index II
用得二分查找,但似乎还有更好的方法,没来得及琢磨。class Solution {public: int hIndex(vector& citations) { int n = citations.size(), result = 0;; int low = 0, high = n-1, mid = low/2+high/2;原创 2015-10-30 16:53:31 · 298 阅读 · 0 评论 -
LeetCode——H-Index
这题简单点就先对数据进行基于比较的排序,时间复杂度O(nlogn),空间复杂度O(1);如果想把时间复杂度将为O(n),就使用基数排序,但空间复杂度上升为O(n)。class Solution { public: int hIndex(vector &citations) { int n = citations.size(); int *num = ne原创 2015-10-30 14:26:15 · 416 阅读 · 0 评论 -
LeetCode——Search a 2D Matrix II
这题《剑指offer》上有,可以从左下角开始搜索,根据当前值与目标值的关系决定向右走还是向上走,用二分搜索更快。知道了这个思路就很容易AC了,但如何优化效率是个问题。我很奇怪这题居然是用Java的普遍运行需时更短,几十毫秒甚至十几毫秒,用C的却普遍在100ms左右,C++就更慢了~原创 2015-11-02 20:48:44 · 320 阅读 · 0 评论 -
Remove Element -LeetCode
Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn't matter what you leave beyond the new length. 这道原创 2015-06-05 10:54:24 · 352 阅读 · 0 评论 -
pagerank
pagerank算法是谷歌用来衡量网页重要程度的一种算法,反映了网页被访问的概率。原创 2015-05-19 22:03:12 · 2081 阅读 · 0 评论 -
算术型数据的溢出
对于C系语言,在使用变量前需要显示声明变量的类型,这样在编译时期就可以执行类型检查,这样的语言称为静态类型语言;变量声明后除非进行显示类型转换,否则变量类型保持不变,这样的语言称为强类型语言。例如,PHP语言使用变量前无须声明,并且没有类型,同一个变量可以多次赋值成不同类型的数据。然而如此分类其实没什么意义,似乎并没有严格的定义来区分静态、动态类型语言和强、弱类型语言。C++的RTTI使其并不是“原创 2015-04-20 21:31:48 · 1004 阅读 · 0 评论 -
Search in Rotated Sorted Array——LeetCode
这道题在LeetCode上是Hard类的,首先声明,代码是别人的,我只是解释一下。class Solution {public:/*如果数组是有序的,那么大家都会想到并使用二分搜索,但本题设置了这样一个障碍:数组是rotate过的。这样,原先有序的数组就变成了局部有序:(假设)分为两个有序的子数组,并且左边子数组中的元素都大于右边子数组中的元素。这时,采用二分搜索,需要判断数组nu原创 2015-06-24 21:01:08 · 350 阅读 · 0 评论 -
Best Time to Buy and Sell Stock——LeetCode
原题地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ 内容都在代码和注释里,就不罗嗦了。class Solution {public: int maxProfit(vector& prices) { /* 这类题目已经遇到过几次,都是要在一维数组中原创 2015-06-24 21:23:26 · 445 阅读 · 0 评论 -
Bitwise AND of Numbers Range——LeetCode
class Solution {public:/*mask的32位全为1,mask*/ int rangeBitwiseAnd(int m, int n) { int i = 0, mask= ~0; while ((m & mask { ++i原创 2015-06-29 23:50:02 · 318 阅读 · 0 评论 -
堆排序
堆是一种完全二叉树,分为小根堆和大根堆。大根堆中任意节点的值都不大于其父节点的值。有些类似于二叉搜索树,都是要求父节点和子节点的值满足某种关系。 堆排序的基本思想是,先用所给数据建立大根堆,堆顶元素即为最大值,将其与最后一个元素交换,此时最后一个元素为最大值;再对最大值之前的元素进行调整,使其恢复为大根堆。再如此将次大值取出排列在最大值之前,循环往复,直到所有元素都排好序。原创 2015-07-08 20:25:48 · 386 阅读 · 0 评论 -
排列组合与子集
Leetcode上有几道题比较类似,Permutation、Combination和Subsets等。说它们相似,是因为思路类似。要求出某个序列的排列组合和子集,初看起来,要对序列中的每个元素排列、取舍,初看起来,似乎要写一个循环层数正比于元素个数的大循环,而语言并没有提供这种功能。这时就要转变思路,先求部分解或子问题的解,再迭代求出原问题的解。原创 2015-06-05 11:27:38 · 599 阅读 · 0 评论 -
gas station-Leetcode
这题还是比较有意思的,会用到一些结论和性质,代码并不复杂。自己懒得写证明了,转载了别人的文章。 主要利用的性质就是:1.如果∑gas[i] >= ∑cost[i],则一定存在解,且题目保证解唯一;2.若在某个区间上,∑gas[i] 第一个性质的大概证明(并非严格的数学证明)请看转载的这篇文章:http://blog.csdn.net/hh794362661/原创 2015-06-12 16:15:53 · 370 阅读 · 0 评论 -
Unique Binary Search Trees-LeetCode
采用动态规划原创 2015-06-14 16:01:40 · 426 阅读 · 0 评论 -
Container With Most Water-Leetcode OJ Problem 11
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two原创 2015-04-14 11:13:59 · 332 阅读 · 0 评论 -
Factorial Trailing Zeroes-Leetcode
本题仍然是考察思路,属于Easy级别,有了思路后只需几行代码即可实现:class Solution {public: /* 要想若干数字之乘积末尾出现0,则这些数字的因子中必须包含末尾为2和5的数字,如 10*2 = 20 = 2*5*2, 6*5 = 30 = 2*3*5 本题是求某个数的阶乘末尾之0的数量,某个数的阶乘就是小于等于这个数且大于1的所有整数之乘积,因原创 2015-06-10 15:41:23 · 322 阅读 · 0 评论 -
Jump Game-Leetcode
这题仍然是考察算法和思路的,有思路了实现并不难。class Solution {public: /* 若∃ index = nums.size()-1,意味着只要能到达第index个元素,就可以通过这个元素到达第 nums.size()-1个元素,此时,我们只需考虑能否从前面的元素到达第index个元素。据此逆序迭代,找到最小的出发点,判断下标是否为0即可。原创 2015-06-09 11:28:51 · 395 阅读 · 0 评论 -
LeetCode——Peeking Iterator
先自己写了个简单粗糙的,然后又看了提示中给的参考答案,模仿着写了一个// Below is the interface for Iterator, which is already defined for you.// **DO NOT** modify the interface for Iterator.class Iterator { struct Data; Data*原创 2015-11-02 20:30:54 · 391 阅读 · 0 评论