![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
freedom098
这个作者很懒,什么都没留下…
展开
-
231:Power of Two
题目链接:https://leetcode.com/problems/power-of-two/方法:二进制思路:一开始做就是不断除以2找奇数,这样做ac了,但是比较麻烦,网上看到一种二进制的做法非常好,简写的话只需要一行就够了。原理是凡是2的幂次数其二进制都有一个特点,那就是首位为1,其余都为0,利用这个特点,当这个数减去1再和这个数本身按位与的话必然是零,由此可解。难点:无c+原创 2015-09-26 19:39:31 · 257 阅读 · 0 评论 -
283:Move Zeroes
题目链接:https://leetcode.com/problems/move-zeroes/方法:无思路:最近leetcode挺火的,决定上手试一下,leetcode只需要写函数,不需要整体实现,但是其实这样限制更多,难度也会更高,这道题是第一道题,难度也不算大,直接上c++和python的代码吧。难点:无c++class Solution {public: voi原创 2015-09-26 10:58:05 · 324 阅读 · 0 评论 -
007:Reverse Integer
题目链接:https://leetcode.com/problems/reverse-integer/方法:无思路:这道题目其实比较坑,按理来说挺简单的,但是他还有溢出时的特殊处理,一开始我都不知道,然后就跪了。之后的大部分时间都是在对付这个异常处理的情况。c++我借鉴了一种方法那就是如果出现溢出,那么之前反转的数字和最后的答案肯定不满足10倍关系,这样就可以判断是否溢出了。这个方法比较适原创 2015-09-26 11:04:32 · 325 阅读 · 0 评论 -
Maximum Depth of Binary Tree
leetcode第104题,最最大树高,由于标签是深度搜索,我就按照深度搜索先做一遍,这要求求最大深度,设置一个变量记录一下深度就可以了,不过这个深度在什么位置自增需要注意,否则结果可能会多1或者少1.最终的递归出口就是节点没有子节点,也就是该节点为叶子节点的时候。由于每个节点接收到的都是来自左右两边子树的深度,因此需要取最大值在继续向上层递交。class Solution(object):原创 2016-07-25 11:14:44 · 281 阅读 · 0 评论 -
Symmetric Tree
leetcode第101题,判断一棵二叉树是不是镜像对称的,一开始的思路是先用广搜遍历出来树的节点,然后按照层的数目进行分割,逐层判断,但是这样做过于麻烦了,之后看到了一个很好的广搜方法,以左右两边为状态进行深度搜索,这个方法非常巧妙,确实不容易想到。# Definition for a binary tree node.# class TreeNode(object):# def原创 2016-07-25 12:12:22 · 300 阅读 · 0 评论 -
3Sum
leetcode第15题,这道题是2sum的升级版,要求求3个数的和为0,而且不止一组,我的基本思路是固定一个数字,将问题转化为2sum,如何求解2sum,方法就多了,比如可以使用双指针法,或者hashmap等等,使用双指针法的时候可能会出现一个小小的问题,那就是固定一个数字的时候,满足条件的另外两个数可能不止一组,所以我最后借鉴了别人的思路改用了字典搜索,两种代码我都附上,之后再看看能不能克服这原创 2016-07-25 17:54:35 · 219 阅读 · 0 评论 -
Min Stack
leetcode第155题,这道题是实现一个简单的栈,如果使用python,用list模拟几乎没有什么难度,但是有一些关键性的细节需要注意,这也是这道题考察我们是否能写出一个健壮程序的思想。是否考虑到栈空的一系列情况是否考虑到最小值不存在的情况最小值如何搜索其中第三个问题很关键,如果单纯调用python中的min函数,会超时,过不了大数据量,我参考的办法是,在压栈的过程中就时刻比较原创 2016-07-26 12:09:09 · 225 阅读 · 0 评论 -
Plus One
leetcode第66题,数组模拟一个大数,数组高位代表数字的低位,计算这个大数加1。第一思路,运用python中提供的各种转换函数,先把列表攒成一个数字,然后执行加1操作,最后在拆分成列表。这种方法比较简单,但是不好处理0开头的情况。第二思路:直接进行大模拟,模拟进位加法,但是不好处理缺位的情况,比如[9]应该返回[1,0]我采用了第二思路。class Solution(obje原创 2016-07-27 10:24:59 · 225 阅读 · 0 评论 -
Group Anagrams
leetcode第49题,归类所有字母相同的单词,这个题目用python非常好做,因为python内置的字典数据结构就是map结构,因此可以直接使用。首先先把列表中的单词依次遍历,原地排序,然后加入到字典当中。这里注意,因为字典的键值必须是一个不可变类型,比如字符串或是元组,因此排序完成后或者用join方法将列表中攒成一个字符串,否则就用tuple转换为一个元组类型。经过试验,join方法的速原创 2016-07-28 20:21:52 · 225 阅读 · 0 评论 -
Divide Two Integers
leetcode 第49题,实现一个整数的除法程序,但是要求不能使用乘除和取余运算。首先考虑一下算法,不能使用乘除和取余,我们还可以使用加减和位运算,最基本的思路是,被除数不断减去除数,同时用一个计数器计数,直到被除数小于除数了,读取计数器的值就是商。但是这样做过不了大数据。上一个思路主要问题太慢,每次都减去的是除数,一旦被除数很大,需要进行很多次这样的操作。如果每次减去的不是除数,而是除原创 2016-07-28 21:40:57 · 240 阅读 · 0 评论 -
Largest Number
leetcode第179题,给出一组整型数字,把他们拼接成一个最大的数字,结果可能超出整型,因此返回字符串。这道题目的关键是如何对所给的数据进行排序,排序的规则比较特殊,需要自定义,然后把函数指针传入sort函数里,这里在c++、java、python中的应用几乎是大同小异,只要排序完成,接下来的工作就是把排序好的字符串连接起来就可以了。如果自己寻找排序的规则,比较麻烦,而且容易考虑补全,原创 2016-07-29 10:17:17 · 214 阅读 · 0 评论 -
Median of Two Sorted Arrays
leetcode第四题,这个题是个排序题,两个有序序列合并为一个有序序列,很明显是归并嘛,而且这个题也有明确的复杂度要求,不过如果使用python,事情瞬间就会变得简单得多,因为python具备了很好的排序算法,因此偷个懒,直接用吧。class Solution(object): def findMedianSortedArrays(self, nums1, nums2):原创 2016-07-19 12:42:55 · 190 阅读 · 0 评论 -
Letter Combinations of a Phone Number
leetcode第17题,排列组合,要求输出指定的按键输入中可能产生的字母排列组合。首先,电话上的数字键对应的字母先要能储存起来,这里使用一个字典。另外,可以看到每增加一个数字键,其实就是在原有基础上在增加一个字母,因此可以用循环直接搞定。或者是利用dfs。class Solution(object): def letterCombinations(self, digits):原创 2016-07-29 16:36:47 · 206 阅读 · 0 评论 -
Binary Tree Inorder Traversal
leetcode第94题,二叉树中序遍历,但是要求不要使用递归,所以就是二叉树遍历的非递归形式,利用栈来做。废话不说多,直接上代码吧。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self原创 2016-07-29 17:26:48 · 180 阅读 · 0 评论 -
Remove Duplicates from Sorted Array
leetcode第26题,数组去重,返回不重复的元素个数即可。注意,这里有一个很重要的先决条件,那就是数组是有序的。数组内的东西可以随便改,而且超出规定长度的元素不理会,这就给了我们提示,也就是说所有的重复元素都可以提到数组前面就可以了。这样就是原地修改了。这里采用双指针的办法,代码中i作为游标指针,start作为第二个指针,start一直指向的是经过置换之后不重复数组的末尾,所以遍历的时候,如果...原创 2016-07-19 22:12:55 · 176 阅读 · 0 评论 -
Rotate Image
leetcode第48题,旋转图像,给定一个二维矩阵,要把它顺时针旋转90度,要就是原地操作。这个题并不算是特别难,但是原地操作会有一些限制。原地操作意味着我们需要找出变换前后每个元素的对应关系,然后就可以直接交换元素,也就完成了原地操作变换,但是这个关系不好找,我就偷个懒,先把矩阵转置,转置的关系很明显是坐标序号颠倒,转置之后的矩阵距离目标矩阵的不同就是每一行都是反序的,这样只要再把每一行倒原创 2016-08-04 08:36:52 · 275 阅读 · 0 评论 -
Word Pattern
leetcode第290题,这个题是一个匹配题,虽然分类是简答题,但是容易出现考虑情况不全的问题。下面一步步分析一下.首先按照题目要求先匹配,最简单的方法当然是用hash,这里我采用了python的字典,将patter中的字母最为键值,逐行扫描patter中的字母和字符串列表中的每个字符串,看能否在字典中匹配,只要有一个匹配不上,就立刻返回False。以上思路不难,下面就是小细节坑爹的地方原创 2016-08-04 09:16:55 · 325 阅读 · 0 评论 -
Jump Game
leetcode第45题,一开始理解错题意,后来发现数组中给出的是可以跳跃的最大距离,而不是固定跳跃的距离,因此这个题就可以用贪心算法了。基本思路是搜索一遍整个数组,然后确定每个位置的最大跳跃值,第一个位置的最大距离肯定是他的数组元素值,之后的每个位置能够达到的最远距有两种可能,一个是这个位置的数组元素值,另一种可能是上一个位置的最远距离减去1,这个1就是i移动了1位,所以最远距离就要减一。确定好原创 2016-07-20 21:18:59 · 186 阅读 · 0 评论 -
Majority Element
leetcode第169题,这个题要求寻找数组中的多数元素,多数元素就是数量多于数组元素个数二分之一的元素,且题目说明数组非空且一定存在该元素。第一种方法,哈希表,有一种数据结构记录每个数出现次数,最后排一下序,找出最大的,这个方法不仅适用于找多数元素,还可以找任意最多数目的元素。这里我使用了python的字典,使用了一些python特有的工具,字典排序,lambda表达式指定的是按键值排序还是按...原创 2016-07-21 10:20:02 · 204 阅读 · 0 评论 -
Ransom Note
leetcode第383题,这道题比较简单,其实就是查字典问题,字典中必须有足够多的字母来满足写信的要求,同时还要具备应该有的字母。直接上代码吧。class Solution(object): def canConstruct(self, ransomNote, magazine): """ :type ransomNote: str原创 2016-08-16 09:58:17 · 344 阅读 · 0 评论 -
Implement Trie (Prefix Tree)
leetcode第208题,字典树的简单实现,上次数学建模比赛的时候就是用的字典树,对于这种数据结构的原理还是比较了解的,不过当时编程水平堪忧,调试了很久。这次我用python来实现字典树,为了实现后缀,我采用字典,这样可以随着动态绑定,另外字典树最重要的还要加入停止标记,来确保单词在什么位置结束。此外,还要考虑到多种情况,比如查找的时候,单词已经遍历完毕,但是树还没有到达结束标记位置,这时候需要原创 2016-07-27 08:23:36 · 253 阅读 · 0 评论 -
Add and Search Word - Data structure design
leetcode第211题,归类标签是字典树,但是看到讨论区解法还是挺多的。这里最不好处理的就是“.”的处理,这里“.”可以代表任意字符,也就意味着遍历到有点符号的时候需要把所有的当前节点下的子节点全部遍历出来,一一比较,这里比较考验技巧了,其中我看到有一种采用递归方法,单独写一个递归函数,我参考了一种更容易理解的方法。class TrieNode(object): def __ini原创 2016-07-27 09:55:46 · 264 阅读 · 0 评论 -
Binary Tree Level Order Traversal
leetcode第102题,按层输出二叉树,这道题看上去简单,但是确实需要一定技巧。首先,既然是按层输出,当然首先想到广搜,但是广搜有一个很大的问题需要解决,那就是如何标记节点属于哪一个层,如果节点的定义可以加入层数属性即可解决,但是树的节点定义不能改变,所以只能想另外的办法。我参考的办法是,在广搜的她同时,不断清除之前层的节点,然后用对列的包含元素数目来记录层的分隔,这样保证在计数器清零原创 2016-07-29 19:45:19 · 307 阅读 · 0 评论 -
Same Tree
leetcode第100题,典型的二叉树的问题,判断两个数是否为相同的二叉树,要求节点数据和树的结构必须完全相同。一开始考虑的是进行树的遍历,因为二叉树的前序遍历加上中序遍历或者后序遍历加上中序遍历可以唯一确定二叉树结构,因此考虑先进行两种遍历,然后比较结果就行了。但是这样做有一个bug,那就是如果元素相同,就无法区分元素是在哪个节点上了,这样一来,遍历结果就不能确定结果了。贴上这种笨办法原创 2016-07-21 09:02:02 · 198 阅读 · 0 评论 -
Path Sum
leetcode第112题,二叉树搜索问题,计算从根到叶子节点路径之和与目标数比较。这道题难度不大,只要是深搜就可以了,废话不说,直接上代码吧。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x#原创 2016-08-15 09:59:01 · 182 阅读 · 0 评论 -
Sum of Two Integers
leetcode第317题,位运算题,在不使用加法和减法的情况下运算加法。很明显就是一个位运算,首先这样分析,位运算就这么几种,与、或、非、异或、移位。选择哪一种是关键。首先加法肯定要所在位的数值相加,异或可以完成这个功能,但是异或没有进位怎么办,用与操作就可以获取进位值出现在哪一位。但是进位制出现在哪一位,加上这一位进位值的是下一位,因此还需要移位操作。程序的流程是先进行与操作,提出进位原创 2016-08-16 15:26:30 · 227 阅读 · 0 评论 -
Gas Station
leetcode第134题,加油站问题,每个加油站加油量和前进至下一个加油站的消耗量都给出,判断从哪一点开始可以完成一圈的行驶。显而易见的是,如果所有加油站的供油量小于消耗量,那么肯定是走不完一圈的,这就是判断是否返回-1的依据。另外,换个角度考虑,如果在某段路程中,油箱的油量小于了加油量,意味着它走不到下一个加油站,此时开始要返回上一个站点。这里有一个技巧是,初始站点设置为-1,这样即使只有原创 2016-07-28 11:02:16 · 213 阅读 · 0 评论 -
Maximum Subarray
leetcode第53题,典型题,必考题,寻找最大和子序列,典型方法,分治法和动态规划。分治法def maxSub(nums,low,high): if low >= high: return nums[low] mid = (low+high)/2 s1 = maxSub(nums,low,mid) s2 = maxSub(nums,m原创 2016-07-21 17:04:15 · 241 阅读 · 0 评论 -
Generate Parentheses
leetcode第22题,括号生成,给定括号的个数,输出所有合法的括号组合。这道题乍一看这的没有啥头绪,我一开始的思路是把括号编号,括号之间关系抽象成互相之间的嵌套,但是这样做一个有一个问题就是重复很多,需要最后一步去重的操作,这样并不是最好的办法。我借鉴了网上一种非常巧妙的办法。括号匹配生成的时候,面临着两种选择,一个是加入右括号,一个是加入左括号,那么什么时候加入左括号,什么时候加入右原创 2016-08-06 10:25:10 · 218 阅读 · 0 评论 -
Longest Substring Without Repeating Characters
leetcode第三题,要求寻找一个最长不重复连续子串。最最简单的想法就是双重循环进行遍历,为了提高效率,可以在第二层循环中做文章,可以使用模拟hash来记录使用过的字符,也可以使用python内置的in方法,还可以使用字典来记录,不过这些方法都有一个问题,那就是复杂度都是o(n2),测试数据中有一个很长的字符串,时间不能满足要求。size = len(s)maxlen = 0for原创 2016-07-19 11:06:25 · 263 阅读 · 0 评论 -
Container With Most Water
leetcode第11题,这个题比较麻烦的一点是,容器的体积受到了两个因素的影响,一个是横坐标之间的距离,另一个就是这两个线条高度的最小值,这两个值相乘才是最终的体积,最笨的办法无非就是遍历所有的可能,然后找出最大的。为了降低复杂度,使用贪心算法,基本思路是,首先假设最大的体积出现在两端,也就是假设现在横坐标间的距离先达到最宽,如果这时体积已经是最大,那么问题就结束了,如果不,是最大体积,那么最大原创 2016-07-19 20:59:04 · 183 阅读 · 0 评论 -
Valid Parentheses
leetcode第20题,括号匹配,典型栈问题,不过这个题难度比传统括号匹配难度稍高,因为有多个括号匹配,而且这些括号不能相互进行穿插,因此需要我们先用字典来储存对应的括号结构,在栈的编码上,也要考虑更多的情况。总的思路是,遇到前括号,就压入栈,遇到后括号,先查看栈中是否有内容,如果没有直接返回False,如果有进一步查看是否能够匹配最近的相同类型的括号,如果匹配成功就弹出一个栈元素,如果不能匹配原创 2016-07-21 21:29:38 · 198 阅读 · 0 评论 -
Nim Game
leetcode第292题。这个题是个脑筋急转弯,一堆石头,两个人交替拿,每个人可以拿1-3个,最后一个石头被谁拿走,谁就获胜。一看这个题我就用递归做了,但是最后超时了,不过没关系,通过递归分析我们可以清楚地看见最后的规律是怎么找出来的。递归思路,首先n为1,2,3的时候显然是可以获胜的,因为可以全部拿走,如果n为4的时候,无论我怎样拿都会输,n为5的时候可以看看拿走1-3个剩余是什么情况原创 2016-08-05 08:13:24 · 254 阅读 · 0 评论 -
Remove Duplicates from Sorted Array II
leetcode第80题,这个题目是之前第26题的升级版,在原来的基础上要求可以允许两个重复的情况出现。其实这样也并不是很苦难,只是在原来的基础上要多增加一个计数器,来计数出现重复数字的个数,一旦重复计数超过两个,就当做一个来看待,最后当再次出现不重复情况的时候,这个计数器就归零。class Solution(object): def removeDuplicates(self,原创 2016-08-17 08:24:03 · 197 阅读 · 0 评论 -
Trapping Rain Water
leetcode第42题,这个题解法非常多,典型的就是栈法和双指针法,除此之外还有不少奇奇怪怪的方法,在此只记录三种。第一种,栈方法,基本思路是,遍历整个高度数组,遇到比之前一项小的元素就压入栈,遇到比前一个元素大的元素则开始检查栈,如果该元素比栈顶元素小,说明可以存水,则弹出栈顶,同时计算存水的量。此时栈中原来的第二个元素成为栈顶元素,继续与该元素比较,直至栈空或者栈顶元素大于该元素,这说明原创 2016-07-22 10:55:44 · 287 阅读 · 0 评论 -
Permutations
leetcode第46题,元素的全排列,这是一个很典型的回溯问题,也是深搜的问题,网上大部分的解法也差不多,我这里参照网上思路使用了两种方法。方法一:回溯全排列这个问题很明显是回溯,但是怎么找状态空间是个问题。假设1234是初始的四个数字,如何产生全排列呢?可以把第一个数字1依次与之后的数字交换,会产生一组数字分别为1234、2134、3214、4321。注意,假设1与2交换,变为2134原创 2016-08-05 10:14:50 · 262 阅读 · 0 评论 -
Subsets
leetcode第78题,寻找给定集合的所有子集,包括空集。一开始准备使用深搜,这也做倒也没啥问题,但是去重是一个很麻烦的事情。换种思路决定用二进制来做。将给定集合的每个元素分别用一个二进制位代表,1表示该元素在子集合中,0表示不在子集中。这样所有二进制数的情况就对应了所有子集的可能情况,只要一一对应出来即可。注意python的bin函数是转换二进制数,但是前面带着一个0b字符,所以我们要对它做一...原创 2016-08-05 11:10:06 · 358 阅读 · 0 评论 -
Combinations
leetcode第77题,排列组合题升级版,这个题的总体难度不太大,但是鉴于使用的是python,如果不剪枝,就一定会超时。首先分析问题,先要按顺序挑选出开头的元素,此时所给集合中的所有元素均可以添加,然后把加上了开头元素的列表向下递归,添加第二个元素,第二个元素的要求应该是第一个元素之后的所有元素均可,同时记录递归层级的变量level自增。递归的出口条件是,当level达到了指定的个数后,数原创 2016-08-17 10:14:34 · 209 阅读 · 0 评论 -
Combination Sum
leetcode第39题,回溯题,要求用给定集合中的数字使得相加等于目标数字,其中给定集合中的数字可以无限次使用。注意,这里题目要求所有数字都是正数,这就保证了递归的出口条件。分析问题,首先,递归的出口条件有两个,一个是相加出现了目标和,那么就加入了结果列表,返回。另外,由于给定集合都是正数,所以相加如果超过了目标和,就要立即返回。然后遍历集合,不断向下递归搜索。还有一个比较关键的问题原创 2016-08-17 10:58:45 · 195 阅读 · 0 评论 -
Summary Ranges
leetcode第228题,要求概括出一组连续数字的范围。这个题目本身并不算是很难,但是需要一些小的技巧来处理一些比较特殊的情况。基本思路就是设置两个标志位,一个开始,一个结束,当判断数组中后一个数字是前一个数字加1,结束标志位标记位数组中的该位,否则就意味着这一段连续数字结束了,输出结果,然后更新开始标志位。注意两个小的细节:1、单个的数字怎么办?输出最后结果要判断一下开始结束标志位原创 2016-08-06 11:27:27 · 206 阅读 · 0 评论