
LeetCode/C++
Jeff_Winger
这个作者很懒,什么都没留下…
展开
-
LeetCode1-两数之和
如果是有序数组,查找两数之和可以从通过定义两个迭代器从两边进行,这样快一点。但是题目没有说明是有序数组,因此只能逐个比较。题目要求结果不能重复,自然想到了map来处理数据,由于用不到map的有序特性,因此为了追求速度选择unordered_map。将已经遍历的结果插入到unordered_map,在下一个数到达时从unordered_map中寻找满足要求的数,如果存在则返回,否则将此数加入unor...原创 2018-06-16 20:28:44 · 243 阅读 · 0 评论 -
leetCode70 爬楼梯
class Solution {public: int climbStairs(int n) { if(n<=2){ return n; } int a=0,b=2,c=1; for(int i=3;i<=n;i++) { a=b+c; /...原创 2018-08-03 14:06:55 · 333 阅读 · 0 评论 -
LeetCode43 字符串相乘
主要用到了大整数的乘法运算思想,就是逐位相乘,然后进位统计结果。代码如下:class Solution {public: string multiply(string num1, string num2) { if(num1=="0"||num2=="0") { return "0"; } int n1=...原创 2018-08-08 14:23:47 · 479 阅读 · 0 评论 -
LeetCode698 划分为k个相等的子集
主要用到了深度优先的搜索思想。先将题意进行转化,k个相等的子集也就是说这k个子集的和为sum,且每个子集的和为sum/k。题目和之前的LeetCode416 分割等和子集的思想一致,也可以转换成背包问题,包的容量为sum/k。不过这次不是只找到一组数来装这一个包,而是找到多个包,这种解法可以找到正确答案,但是代码会很长,不推荐。直接用深度优先的思想做代码量就很简单了。代码如下:class...原创 2018-08-15 23:35:24 · 2201 阅读 · 0 评论 -
LeetCode40 组合Ⅱ
思想和LeetCode39:https://blog.youkuaiyun.com/Jeff_Winger/article/details/81589910 一致。都是深度优先搜索,区别是本次组合中在一个子集中不能重复使用数组中的数字。当然在子集中可以使用其他子集的元素,子集之间不能重复。为了防止添加相同集合在结果数组中,我们先对原数组排序。结果数组用set表示,set的类型vector<int>...原创 2018-08-16 19:19:58 · 219 阅读 · 0 评论 -
LeetCode198 打家劫舍
主要用到了动态规划的思想,状态转化方程为dp[i]=max(dp[i-1],d[i-2]+nums[i]),代码如下class Solution {public: int rob(vector<int>& nums) { if(nums.size()<=1){ return nums.size()==0?0:nums...原创 2018-08-17 16:25:49 · 320 阅读 · 0 评论 -
LeetCode213 打家劫舍Ⅱ
思想和打家劫舍 https://blog.youkuaiyun.com/Jeff_Winger/article/details/81779581一致,只不过多算了一次,代码如下:class Solution {public: int rob(vector<int>& nums) { if(nums.size()<=1){ re...原创 2018-08-17 17:17:24 · 321 阅读 · 0 评论 -
LeetCode51 N皇后
首先我们需要知道该怎么样放置皇后,观察题目可以看到,在每一行或者说每一列都一个皇后,而且如果在某个位置有皇后,那么她所在的行和列,以及对角线上的位置都不能有皇后。因此我们的思想借助回溯和递归的思想,首先在第一行的某个位置放置一个皇后,然后开始在下一行的找是否有合适位置(递归),如果到达了最后一行的位置,则说明已经找到了一种放置方法,将此方法记录。找到之后,又回溯,把所有位置恢复为原来的状态,从...原创 2018-08-24 21:09:08 · 207 阅读 · 0 评论 -
LeetCode52 N皇后Ⅱ
本题的思想和 N皇后 https://blog.youkuaiyun.com/Jeff_Winger/article/details/82024447完全一致。代码如下:class Solution {public: int totalNQueens(int n) { int* posQ=new int [n]; //posOfQueen[i]表示i行皇后的位置(所在的列) ...原创 2018-08-24 21:11:21 · 226 阅读 · 0 评论 -
LeetCode 50 计算pow(x,n),给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
主要思想是递归,代码如下;class Solution {public: double Power(double base, int exponent) { if(exponent<0){ return 1/Power(base,-exponent); }else if(exponent==0){ ...原创 2018-09-02 15:44:55 · 316 阅读 · 0 评论 -
LeetCode93 复原IP地址
首先需要知道IP地址的特性,总共有四段,每段的取值都在[0,255]之间,四段之间用3个‘.’隔开。目标就是如何放置这3个分隔符,使得IP地址是合法的,然后把合法的IP地址记录下来。方法一 暴力解法。四段的长度都有取1~3的可能性,遍历所有的情况,记录合法IP地址。当然类似000,001,00,010这种肯定是不合法的段,将字符串段转换成整数,又把整数转换成字符串,就可以把间接的把这些长度上有...原创 2018-09-09 18:08:50 · 1217 阅读 · 0 评论 -
LeetCode233,数字1的个数
规律如下:如果第 i 位(自右向左,从1开始标号)上的数字是0,则第 i 位可能出现 1 的次数由更高位决定(若没有高位,则高位为0),等于更高位数乘以当前位数的权重(10i-1)如果第 i 位上的数字为 1,则第 i 位上出现 1 的次数不仅受更高位影响,还受低位影响(若没有低位,则低位为0),等于更高位数乘以当前位数的权重 (10i-1) + (低位数 + 1)如果第 i 位上的数...原创 2018-09-13 21:10:50 · 1033 阅读 · 0 评论 -
LeetCode94二叉树的中序遍历
(1)普通递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }...原创 2018-08-07 20:45:22 · 187 阅读 · 0 评论 -
LeetCode63 不同路径Ⅱ
本题的基本思想和LeetCode不同路径62 https://blog.youkuaiyun.com/Jeff_Winger/article/details/81484395的思想基本一致,只不过加了一个条件,就是障碍物。其实思想一致,路径还是来自左边和上边的路径数之和,只不过当位置点有障碍时,此点不通路径数为0;当左边方向有障碍物时,左边的路径数就不计了,起始如果左边或者上边有障碍物不仅仅是不能通过这些方向...原创 2018-08-07 17:28:47 · 271 阅读 · 0 评论 -
LeetCode2-两数相加
刚看到题目,我首先想到的是转换成十进制数相加,试了一下当链表长度很大时不仅耗时很长,还很容易出错。因此要转变思路。我们在草稿纸上计算两个数之和时都要逐位相加的,注意到相同的位相加结果要么是10以内的数,要么是10-20内的数,超过10的要向高位进1。因此可以想到先把所有的同位的两个数相加,保存在链表里,然后遍历链表节点,如果节点的值大于等于10,则它的next位(高位)就要加1,然后把该节点的值减...原创 2018-06-16 21:08:15 · 213 阅读 · 0 评论 -
LeetCode3-无重复字符的最长子串
直接可以想到的方法就是,以每个字符为开头寻找不重复的子串,记录下该子串的长度,最后返回这些子串中最长的子串,这种方法虽然可以解决问题,但是很暴力,复杂度为O(n^3)。 处理无重复字符的问题,想到可以用map来解决,选择unordered_map<字符,序号>。把没有重复的字符添加到map中,如果出现了重复字符,则说明子串的区间肯定在map中那个重复字符之后开始,不...原创 2018-06-17 16:16:34 · 232 阅读 · 0 评论 -
LeetCode4-两个排序数组的中位数
对于单个数组的中位数很好求,如果个数是奇数则中位数为array[n/2],个数是偶数则中位数为(array[n/2]+array[n/2-1])/2。对于两个数组的中位数实际就是合并后数组的中位数,但是题目要求复杂度为O(log(m+n)),因此先合并再求中位数的方法放弃。可以从两数组的元素大小顺序入手,奇数数组是左中位数和右中位数和的一半,偶数数组的中位数就是右中位数(第n/2+1个数)...原创 2018-06-18 14:34:10 · 326 阅读 · 0 评论 -
LeetCode39-组合总和
主要用到了深度优先搜索(DFS)的思想,需要注意的是在搜索的过程中对已经达到的点不做标记,因为我们的题目中允许数字重复。从当前节点开始DFS(包含当前节点)。代码如下:执行用时12msclass Solution {public: vector<vector<int>> combinationSum(vector<int>& candidate...原创 2018-07-04 11:50:40 · 288 阅读 · 0 评论 -
LeetCode5 最长回文子串
这里在网上搜集了三种方法(1) 用动态规划的思想来做,isP[i][j]可以表示该字符串是否为回文子串,如果是则长度是j-i+1,否则不记录长度,最后比较找到最大的长度。动态规划方程是isP[i][j]=1(i==j.i+1=j,i+2=j,也就是j-i<=2),isP[i][j]=s[i]==s[j]&&isP[i+1][j-1](j-i>2)。 ...原创 2018-07-22 19:16:05 · 232 阅读 · 0 评论 -
LeetCode874 模拟行走机器人
理解本题的题意很关键,机器人在(0,0)点开始行走,如果(0,0)点有障碍怎么办,这种情况是不管它,开始下一步行走,一旦机器人离开(0,0)点,这个点的障碍物才生效,后面如果回到此点则不能跨过此障碍。也就是说我们需要先走一步,再去判断这一步是否有效,有效则更新坐标,否则原地不动,继续下一次动作。至于右转和左转实际就是改变机器人的朝向,起初机器人向北,右转则朝向东,左转则朝向西。不同的朝向,意味着向...原创 2018-08-09 21:35:14 · 1841 阅读 · 0 评论 -
LeetCode125 验证回文子串
从字符串两边开始相向验证,遇到不是字母或者数字的字符时跳过直到遇到字母或者数字为止。接下来就和普通的回文子串验证一样了,相等继续,不相等则返回false。代码如下:class Solution {public: bool isPalindrome(string s) { int left=0; int right=s.size()-1; ...原创 2018-08-11 17:40:27 · 215 阅读 · 0 评论 -
LeetCode416 分割等和子集
主要的思想来源于0/1背包问题,解决方法是动态规划。我们可以想到,把数组分割成两份,并且和相等,那么每一份的和是总和的一半。那么问题就可以转化为找到一组数,使得他们的和逼近sum/2,最后判断最大的和是否等于sum/2,如果是则说明存在这样的组合,也就是存在子集。其和为sum/2,当然了另一个集合的和也就是sum/2。注意到如果数组的总和为奇数,则可以直接判断不存在这样的子集。所以在...原创 2018-08-14 22:30:42 · 955 阅读 · 0 评论 -
LeetCode39 组合总和
主要用到了深度优先搜索(DFS)的思想。因此每个可能的组合都是以数组中的每个数字开始的,对于每个数字都要进行深度搜索。深度搜索的条件是,每次到达一个深度,目标值减去深度下降值,如果目标值为0说明到底了。如果目标值大于0则说明还没到底,继续在此点深度搜索。如果目标值小于0,说明下降的太过了,停止,并且返回到上一级,继续以其他深度下降,直到所有的深度值全都遍历,这算完成了以某一个数字开始的搜索。然后继...原创 2018-08-11 19:16:18 · 274 阅读 · 0 评论 -
LeetCode74 搜索二维矩阵
class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { //对整个二维数组使用二分法查找 if(matrix.empty()){ return false; } ...原创 2018-08-02 19:59:39 · 341 阅读 · 0 评论 -
LeetCode62 不同路径
本题的主要思路就是动态规划问题。首先找动态规划的递归表达式,假如咱们站在终点看,那机器人来的方向有两个,左边方向和上边方向,也就是到达此位置的路径数目就是这两个方向的数目之和。借助矩阵很容易写出递归表达式,num[i][j]=num[i-1][j]+num[i][j-1]。需要注意的点是当位置在矩阵的最上边的行和最左侧的行时,路径数为1,因为机器人只能往右边和下边走,不能往上或者往左边拐。代码...原创 2018-08-07 17:17:28 · 309 阅读 · 0 评论 -
LeetCode 10 正则表达式匹配
基本思想,逐个字符匹配,查看对应位置的字符是否相等,或者删除前一个字符后查看是否相等,或者重复前面字符(指的是上一个位置的字符,而不是所有前面的字符中的任意一个)若干次后查看是否相等。为了方便分析,首先我们要对两个字符串的类型进行分类,字符串S是指只包含字母的普通字符串,字符串P指的是包含‘.’和‘*’的模式字符串。这两个字符串出现的情形可以分为以下四种。1)两个字符串都为空,那么不用匹配了,...原创 2018-09-22 18:55:05 · 226 阅读 · 0 评论