自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

滴水穿石,慢慢积累,总会有成果

随手记录,持之以恒

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

原创 LeetCode 做题小结

题目 类型 1. Two Sum 简单题 2. Add Two Numbers 链表 3. Longest Substring Without Re

2017-04-24 22:00:14 685

原创 深入理解 Block

本文主要根据《Objective-C高级编程》这本书中的第二章来进行的一个总结,其中包含了查看其它文章后的总结和自己的一些理解,关于 block 的一些定义在这里就不说了,这里主要讲一下 block 中的截获自动变量和 __block 关键字的实现 文章主要内容如下:一个普通的 block截获自动变量值__block 修饰符循环引用一个普通的 blockint main

2017-10-06 16:30:38 770

原创 LeetCode 125. Valid Palindrome

题意判断一个字符串是否是回文串,串中只取数字或者字母,大写和小写字母按相同计算思路思路一:遍历字符串,将数字和字母提取出来一个新的字符串,然后遍历新的字符串来判断是否是回文串。这种方法多出了 O(n)O(n) 的空间复杂度思路二:定义两个指针 L, R,分别从开始和最后的点开始遍历,每次取符合条件的字符,然后判断,这样没有额外的空间复杂度代码思路一:class Solution {public:

2017-09-11 14:22:53 941

原创 LeetCode 98. Validate Binary Search Tree

题意判断一棵树是否是二叉排序树思路递归中维护当前子树的最大值和最小值,左子树维护最大值,右子树维护最小值,然后进行判断代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod

2017-09-11 14:01:18 439

原创 LeetCode 141. Linked List Cycle

题意判断一个单链表是否存在环思路设置两个指针快和慢,快指针每次前进两个节点,慢指针每次前进一个节点.时间复杂度:O(n)O(n)代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x),

2017-09-10 17:03:15 300

原创 LeetCode 160. Intersection of Two Linked Lists

题意求两个链表的交点思路思路一:求出两个链表的长度差,然后将较长的一个偏移长度差的长度,然后求交点思路二:类似于求链表是否存在环,设定两个指针,如果一个指针走到底了,那么从另一个链表的头节点开始继续,直到两个指针相等.代码思路一:/** * Definition for singly-linked list. * struct ListNode { * int val; *

2017-09-10 16:50:52 367

原创 二叉树总结

什么是二叉树?引用自百度百科: 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree),同样的左右子树也都是二叉树.前言本文代码实现为 C/C++,因为不是一个完整的讲解文章,只是个人思路,所以说思路讲解可能有不足之处,有错误请指出.节点定义使用单向链表的形式,只保存当前节点的子节点和权值,不保存父节点

2017-09-06 19:39:48 575 2

原创 LeetCode 146. LRU Cache

题意设计一个 LRUCacheLRU Cache 的算法,什么是 LRULRU,可以参考:LRU思路使用 HashHash + 双向链表,主要是链表的删除和添加操作,链表头为新加入的任务,链表尾为最近最久未被使用的任务. 当新来一个任务之后,查看 HashHash 表中时候存在:如果存在,将此任务置于链表的头结点,操作为:先删除链表中的此任务,然后将此任务重新加入链表如果不存在,说明需要删除链

2017-09-05 12:52:47 336

原创 堆排序

堆排序在排序算法中算是比较晦涩难懂的一种,和快速排序、归并排序一样,平均时间复杂度为O(nlogn)O(nlogn) ,要了解堆排序,必须点亮前置技能点—二叉堆&二叉树。二叉堆定义:一种经过排序的完全二叉树性质:任意父节点的值都大于等于或小于等于子节点的值每个节点的左右子堆也都是二叉堆种类:最大堆 也称大顶堆,即每个父节点的值都大于等于子节点的值,适用于从小到大排序. 最小堆 也称小

2017-08-29 14:43:48 376

原创 LeetCode 70. Climbing Stairs

题意从第00层阶梯到第nn层阶梯有多少中方法,每次只能上一层或者两层思路经典的DPDP问题,dp[i]dp[i]表示到第ii层的方法数,那么要到第ii层,只能从第i−1i - 1层或者第i−2i - 2层上来,那么可以得出: dp[i]=dp[i−1]+dp[i−2]dp[i] = dp[i - 1] + dp[i - 2].因为不想开辟新的内存,所以说手动模拟了,但是思想和DPDP是一样的.代码

2017-06-09 14:09:39 340

原创 LeetCode 69. Sqrt(x)

题意求n√\sqrt{n}思路使用二分法求解,其中注意,mid∗midmid * mid有可能会intint溢出.代码class Solution {public: int mySqrt(int x) { if(x <= 0) return 0; int l = 1, r = x; while(l < r){ int

2017-06-09 14:01:17 269

原创 LeetCode 67. Add Binary

题意将两个二进制数字相加思路和十进制相加一样的思想,只是进位变化一下代码class Solution {public: string addBinary(string a, string b) { return add(a, b); }private: string add(string A, string B){ int lenA = A

2017-06-08 22:48:08 224

原创 LeetCode 66. Plus One

题意将一个存于数组中组成的数字加一思路直接模拟代码class Solution {public: vector<int> plusOne(vector<int>& digits) { string num1 = ""; for(int i = 0; i < digits.size(); i++) { num1 += digits[i]

2017-06-08 22:45:01 216

原创 LeetCode 65. Valid Number

题意验证一个字符串是否为数字思路可能会出现的情况:前导空格和后缀空格字符串存在多个小数点或者多个ee小数点前面没有数字,这种情况是truetrueee前面没有数字,这种情况是falsefalseee或者小数点后面没有数字是falsefalse代码class Solution {public: bool isNumber(string s) { int len =

2017-06-08 22:37:30 266

原创 LeetCode 64. Minimum Path Sum

题意一个n∗mn * m的地图,每个点有一个权值,求从左上角到右下角的最小路径权值和.思路经典的DPDP问题,dp[i][j]dp[i][j]表示到达点(i,j)(i, j)的最小权值和,同样的到达一个点(i,j)(i, j)只能从点(i−1,j)(i - 1, j)或者点(i,j−1)(i, j - 1),那么可以得出dp[i][j]=dp[i][j]+min(dp[i−1][j],dp[i][j

2017-06-08 21:03:01 276

原创 LeetCode 63. Unique Paths II

题意给出一个n∗mn * m的地图,地图中会存在障碍,求从左上角到右下角的方案数,只能向右走或者向下走思路和上一题62. Unique Paths差不多,只是多了一些障碍,只需要判断一下就可以了,需要注意对于边界的处理如果前一步不能到达,那么当前也是不可能到达的.代码class Solution {public: int uniquePathsWithObstacles(vector<ve

2017-06-08 20:44:33 262

原创 LeetCode 62. Unique Paths

题意一个n∗mn * m的地图,求从左上角到右下角的不同路径数,只能向下或向右走思路经典的DPDP模型,dp[i][j]dp[i][j]表示到达点(i,j)(i, j)的方案数,因为只能向右或者向下行走,所以说到达点(i,j)(i, j)的只能是点(i−1,j)(i - 1, j)或者点(i,j−1)(i, j - 1),那么可以得出dp[i][j]=dp[i−1][j]+dp[i][j−1]dp[

2017-06-08 20:01:04 254

原创 LeetCode 61. Rotate List

题意将一个链表向右旋转kk个位置思路直接定位旋转后的尾结点,然后将原始尾结点的nextnext指向原始头结点,然后将旋转后尾结点的原始nextnext指向的结点置为头结点.需要注意的case:k有可能会大于链表长度代码/** * Definition for singly-linked list. * struct ListNode { * int val; * List

2017-06-08 19:48:21 246

原创 LeetCode 60. Permutation Sequence

题意求出11到nn全排列的第k个序列.思路康拓逆展开的模板题目代码class Solution {public: string getPermutation(int n, int k) { vector<int>f; f.push_back(1); for(int i = 1; i <= n; i++){ f.push

2017-06-08 19:33:28 257

原创 LeetCode 59. Spiral Matrix II

题意对n∗nn * n的矩阵进行蛇形填数思路蛇形填数,螺旋模拟即可代码class Solution {public: vector<vector<int>> generateMatrix(int n) { vector<vector<int> >ans(n, vector<int>(n)); int dis = n; int num = 1,

2017-06-08 14:34:06 253

原创 LeetCode 58. Length of Last Word

题意找出一个含空格的字符串的最后一个单词思路直接倒着遍历,注意后面可能有多个空格代码class Solution {public: int lengthOfLastWord(string s) { int len = s.length() - 1; int ans = 0; while(len >= 0 && s[len] == ' ') l

2017-06-08 14:19:31 235

原创 LeetCode 57. Insert Interval

题意给一个已经分好块的序列,现在要向其中添加一个块,求添加后的块序列思路解法一: 直接将新添加的块添加到序列中,然后重新排序进行组合解法二: 遍历序列,寻找添加块应该处的位置,期间对可以连接的块进行连接.代码/** * Definition for an interval. * struct Interval { * int start; * int end; *

2017-06-08 14:07:25 280

原创 LeetCode 56. Merge Intervals

题意给出nn个区间,合并连续的区间并进行分块思路使用贪心的思想,按照起始点和结束点进行排序,然后遍历记录当前块的起始点和结束点,如果遍历点不在当前块内,存储当前块,然后重新分块,更新当前块.代码/** * Definition for an interval. * struct Interval { * int start; * int end; * Interva

2017-06-08 13:31:56 235

原创 LeetCode 55. Jump Game

题意给出nn个点和当前点能前进的最长距离,问能否从第一个点到达最后一个点思路从最后开始便利,将locloc点看做目标点,如果遍历的点能够到达,那么更新目标点为遍历点,因为在前面只需要到达目标点即可到达最后.代码class Solution {public: bool canJump(vector<int>& nums) { size_t len = nums.size();

2017-06-07 20:38:39 281

原创 LeetCode 54. Spiral Matrix

题意以螺旋顺序输出一个n∗mn * m的矩阵思路因为不想使用额外的内存空间,所以说写的很麻烦,写到最后发现有几个bugbug,所以就用了一个hashhash来进行修改,思想不是很麻烦,按照顺序模拟就好了.代码class Solution {public: map<int, int>mp; vector<int> spiralOrder(vector<vector<int>>& ma

2017-06-07 20:34:36 278

原创 LeetCode 53. Maximum Subarray

题意求一个序列中最大的子序列和思路很经典的题目了,可以DPDP,很麻烦的线段树也可以实现,但是时间复杂度较高,这里使用一个巧妙的方法,代码很短,手动模拟一下即可理解.代码class Solution {public: int maxSubArray(vector<int>& nums) { size_t len = nums.size(); int ans

2017-06-07 15:21:16 219

原创 LeetCode 52. N-Queens II

题意求出可以摆放nn个皇后的棋盘方案数思路和上一题51. N-Queens一样,只不过是要求方案数.代码class Solution {public: int totalNQueens(int n) { vector<int>loc; for(int i = 0; i < n; i++){ loc.push_back(-1);

2017-06-07 15:02:21 252

原创 LeetCode 51. N-Queens

题意求出含有nn个皇后的所有的棋盘摆放方案思路经典的DFSDFS + 回溯问题,使用loc[i]loc[i]表示第ii列的皇后在第几行,后面的就是DFS+回溯DFS + 回溯了,各大算法和数据结构的书中都有这种问题,就不再写思路了.代码class Solution {public: vector<vector<string>> solveNQueens(int n) { v

2017-06-07 14:56:23 310

原创 LeetCode 50. Pow(x, n)

题意计算Pow(x,n)Pow(x, n)思路直接使用快速幂,但是需要注意nn为负数时候的情况.代码class Solution {public: double myPow(double x, int n) { double ans = 1.0; int flag = n; n = abs(n); while(n){

2017-06-07 13:58:37 291

原创 LeetCode 49. Group Anagrams

题意将nn个单词按照字母组成分组,字母组成相同的为一组思路使用hashhash将字母组成相同的放在一起,验证字母组成的时候直接将单词中的字符排序即可,最后遍历hashhash表进行结果的添加.代码class Solution {public: map<string, vector<string>>mp; vector<vector<string>> groupAnagrams(ve

2017-06-07 13:51:27 259

原创 LeetCode 48. Rotate Image

题意将一个n∗nn * n的矩阵顺时针旋转9090度思路因为还要使用原有矩阵的数,所以说将结果存于一个中间矩阵,然后最后复制给原有矩阵.代码class Solution {public: void rotate(vector<vector<int>>& matrix) { size_t len = matrix.size(); vector<vector<i

2017-06-07 13:28:26 212

原创 LeetCode 47. Permutations II

题意求一个含重复元素的序列的全排列思路根据求最小字典序的思路,对序列进行去重的同时进行交换DFSDFS求得序列.代码class Solution {public: vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int> >ans; sort(nums.begin(),

2017-06-07 10:39:40 224

原创 LeetCode 46. Permutations

题意求一个不重复的序列的全排列思路直接使用DFSDFS,使用hashhash标记当前数是否使用过代码class Solution {public: map<int, int>mp; vector<vector<int>> permute(vector<int>& nums) { vector<vector<int> >ans; vector<int>

2017-06-06 16:00:35 199

原创 LeetCode 45. Jump Game II

题意有nn个点,每个点有从这个点最多能前进的距离,求从第一个点到最后一个点的最少步数思路首先应该想到搜索,但是DFSDFS太耗时,所以想到BFSBFS,但是如果按照距离来进行搜索,可能还是会超时,所以说要使用其他方法,可以发现,选择的落脚点必然是越靠近终点越好,所以设置三个变量:maxLocmaxLoc:当前选择的落脚点能到达的最远处maxPosmaxPos:当前遍历点能到达的最远处ansan

2017-06-06 15:47:55 233

原创 LeetCode 44. Wildcard Matching

题意两个字符串S,PS, P,判断两个字符串是否匹配,其中PP中可能含有∗*和?? ∗*表示可以匹配00个或者多个任意字符 ??表示可以匹配任意的一个字符思路解法一: 直接DFSDFS,定义两个指针i,ji,j,分别指向S,PS,P,然后依次遍历,其中会出现下面几种情况:s[i]==p[j]s[i] == p[j]或者p[j]==′?′p[j] == '?' 当前字符匹配,i++,j++i

2017-06-03 18:18:47 241

原创 LeetCode 43. Multiply Strings

题意求两个字符串表示的数字相乘思路可能会很大,所以说使用字符串处理,模拟乘法的步骤,分解一个数的每一位和另一个数相乘,然后将得出的数加起来即可.代码class Solution {public: string multiply(string num1, string num2) { size_t len1 = num1.length(); size_t le

2017-06-03 16:09:03 245

原创 LeetCode 42. Trapping Rain Water

题意给一个序列,里面是柱子的高度,求在一场雨之后,可以存储多少水 例:[0,1,0,2,1,0,1,3,2,1,2,1] 如图所示,箭头所指即为所能储存的水量思路如果一个区间内如果可以存水,那么这个区间必定满足凹函数的分布,所以说可以设置一个指针指向遍历过程中最高的那根柱子,然后如果遇到和最高的柱子一样高或者比其还要高的柱子,那么说明这里可以存水,当然,中间需要记录,这时需要切换指针到这个柱子继

2017-06-03 15:25:59 336

原创 LeetCode 41. First Missing Positive

题意找出一个序列第一个缺失的正整数,时间复杂度要求O(n)O(n),不能开辟新的内存思路因为不能开辟内存,所以只能从原有数组下手,题目规定了要找的数为正整数,所以说可以使用原有数组建hashhash表,将正整数映射在数组中,但是序列的最大值可能为序列的长度,所以说映射过程中要把正整数ii映射在nums[i−1]nums[i - 1]的位置,最后遍历寻找缺失的数.需要注意的case:缺失的数在末尾且

2017-06-03 14:56:10 243

原创 LeetCode 40. Combination Sum II

题意给定一个可能有重复元素的序列,找出取出的数之和为targettarget的方案思路和上一题差不多,这次里面元素的个数受到了限制,所以可以统计每个数出现的次数,然后对序列进行排序去重,然后用和上一题一样的方法来求,只是中间取出元素的个数不能超过它的个数.代码class Solution {public: map<int, int>mp; vector<vector<int>> c

2017-06-02 22:21:00 313

原创 LeetCode 39. Combination Sum

题意给定一个不重复的序列和一个targettarget,序列中的每个数可以取多次,求取出数的和为targettarget的方案思路直接DFS求出每个数要取几个即可代码class Solution {public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { sort(ca

2017-06-02 22:04:15 265

空空如也

空空如也

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

TA关注的人

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