算法面试题
CommissarMa
Keep studying!Keep running!
展开
-
leetcode538 把二叉搜索树转换为累加树(递归与非递归两种实现)
右根左的遍历方式,不断累加即可。递归实现:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solut...原创 2019-05-05 20:12:00 · 210 阅读 · 0 评论 -
leetcode36 有效的数独
这道题按照题意做就OK了。class Solution(object): def isValidSudoku(self, board): """ :type board: List[List[str]] :rtype: bool """ def isValid(little_board): ...原创 2019-04-30 23:01:45 · 114 阅读 · 0 评论 -
leetcode344 反转字符串
思路:设置start和end两个下标,然后不断交换即可。class Solution(object): def reverseString(self, s): """ :type s: List[str] :rtype: None Do not return anything, modify s in-place instead. ...原创 2019-04-30 23:12:33 · 94 阅读 · 0 评论 -
leetcode387 字符串中的第一个唯一字符
这道题我一开始用OrderedDict做的,但显然效率很低。import collectionsclass Solution(object): def firstUniqChar(self, s): """ :type s: str :rtype: int """ d=collections.Order...原创 2019-05-01 11:16:19 · 91 阅读 · 0 评论 -
leetcode242 有效的字母异位词
这道题最简单的思路:使用排序。但时间复杂度至少为O(nlogn)class Solution(object): def isAnagram(self, s, t): """ :type s: str :type t: str :rtype: bool """ return sorted(s...原创 2019-05-01 11:43:11 · 81 阅读 · 0 评论 -
leetcode125 验证回文串
本题与字符串reverse类似。class Solution(object): def isPalindrome(self, s): """ :type s: str :rtype: bool """ #处理原始字符串 s_new=[] for c in s: ...原创 2019-05-01 12:04:32 · 77 阅读 · 0 评论 -
leetcode28 实现strStr()
比较普通的思路是进行遍历,每次进行列表比对:class Solution(object): def strStr(self, haystack, needle): """ :type haystack: str :type needle: str :rtype: int """ if ne...原创 2019-05-01 13:24:33 · 110 阅读 · 0 评论 -
leetcode14 最长公共前缀
思路:纵向扫描:从下标0开始,判断每一个字符串的下标0,判断是否全部相同。直到遇到不全部相同的下标。时间性能为O(n*m)。class Solution(object): def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str ...原创 2019-05-01 14:23:42 · 82 阅读 · 0 评论 -
leetcode237 删除链表中的节点
思路:只给当前点的话,那就只能把后面的结点依次移上来了。# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass Solution(object): ...原创 2019-05-01 14:39:32 · 89 阅读 · 0 评论 -
leetcode169 求众数
思路:一种思路是进行排序,另一种是哈希表。class Solution(object): def majorityElement(self, nums): """ :type nums: List[int] :rtype: int """ n=len(nums) d={} ...原创 2019-05-13 22:05:27 · 102 阅读 · 0 评论 -
leetcode142 环形链表 II
思路:快慢指针或者用哈希表。# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass Solution(object): def detectCy...原创 2019-05-13 21:23:30 · 100 阅读 · 0 评论 -
leetcode283 移动零
这道题一上来的思路是类似冒泡排序,遇到0就沉下去,但这样的操作次数接近于n^2。因此,我第二个思路是首先遍历一遍数组,记录下0元素的个数和非0元素的个数,然后在第二次遍历中,用i来表示当前遍历到第几个元素,用temp_i来当前非零元素可以放的位置,当非零元素放完之后,剩余的补0,所以一共需要移动元素n次。class Solution(object): def moveZeroes...原创 2019-04-30 21:22:29 · 116 阅读 · 0 评论 -
leetcode48 旋转图像
解题思路:一层一层进行旋转,层数为int(n/2)+n%2,其中n是矩阵维数。每一层中顺时针进行旋转,注意下标要仔细核对,即可完成本题,我的代码超越了100%的提交。class Solution(object): def rotate(self, matrix): """ :type matrix: List[List[int]] ...原创 2019-04-30 20:51:16 · 75 阅读 · 0 评论 -
leetcode669 修剪二叉搜索树 ★
思路分析: 这道题与 LeetCode 删除二叉搜索树中的节点 非常类似,但是相比之下简单很多。首先,我们知道二叉搜索树的定义是:左子树的节点元素值 < root的值 < 右子树的节点元素值,并且左子树、右子树同样满足这个条件(递归定义)。算法描述:如果root的值 < L,说明,root和root->left都需要删除(因为左子树的节点元素值 < root...原创 2019-05-05 20:35:41 · 190 阅读 · 0 评论 -
leetcode96 不同的二叉搜索树
思路:假设n个节点存在二叉排序树的个数是G(n),1为根节点,2为根节点,...,n为根节点,当1为根节点时,其左子树节点个数为0,右子树节点个数为n-1,同理当2为根节点时,其左子树节点个数为1,右子树节点为n-2,所以可得G(n) = G(0)*G(n-1)+G(1)*(n-2)+...+G(n-1)*G(0)class Solution: def numTrees(self, ...原创 2019-05-05 20:59:11 · 167 阅读 · 0 评论 -
leetcode55 跳跃游戏
这道题如果采用循环的方式,每次记录下一跳能到哪里,则时间复杂度为O(n^2),太慢了。因此,我们需要想更加简单的方法。我们发现,当经过某一跳时,我们可以知道通过这一跳之后能达到的最远距离,只要这个最远距离能够达到最后一个即可。因此,我们每经过一跳,我们就看下能不能到最远,如果能则返回True,不能的话我们就记录下当前能跳到的最远,然后继续判断能否跳到下一个点。class Soluti...原创 2019-05-05 21:39:45 · 253 阅读 · 0 评论 -
leetcode189 旋转数组
这道题可以有多种做法:介绍两种常规的。第一种比较容易想到,对于nums=[1,2,3,4,5,6,7]和k=3,进行k次循环,每次循环中只将最后一个元素移动到数组的第一个位置,其余元素向后移一位。所以总时间复杂度为O(kn),思路比较简单,但提交到Leetcode会提示超时。代码如下:class Solution(object): def rotate(self, nums, k...原创 2019-04-30 15:40:21 · 95 阅读 · 0 评论 -
leetcode17 电话号码的字母组合 ★
思路:暴力法或者递归。1)暴力法:每次算上一个result字母集合与下一个digit对应字母集合的笛卡尔积class Solution: def letterCombinations(self, digits: str) -> List[str]: dict_digit={'2':['a','b','c'],'3':['d','e','f'], ...原创 2019-05-06 10:09:41 · 181 阅读 · 0 评论 -
leetcode217 存在重复元素
这道题使用哈希表即可。class Solution(object): def containsDuplicate(self, nums): """ :type nums: List[int] :rtype: bool """ if len(nums)==0: return Fals...原创 2019-04-30 16:51:33 · 75 阅读 · 0 评论 -
leetcode350 两个数组的交集 II
思路:用哈希表分别统计两个列表中元素出现的次数,然后取minclass Solution(object): def intersect(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: List[int] ...原创 2019-04-30 18:07:51 · 111 阅读 · 0 评论 -
leetcode61 加一
这题按题意做即可,我用一个flag=1代表需要进位。时间上超过了99.69%的提交。class Solution(object): def plusOne(self, digits): """ :type digits: List[int] :rtype: List[int] """ digits.rev...原创 2019-04-30 18:40:32 · 98 阅读 · 0 评论 -
leetcode46 全排列
思路:对于[1,2,3]而言,我们可以先固定1,然后对2,3进行全排列;同样的,可以固定2,对1,3进行全排列……因此,我们可以采用递归的方式求解。具体地,我们使用两个变量nl和nr,nl代表固定好的数字们,nr代表剩余要进行全排列的数字们。然后每次从nr中抽出一个新的数字加入到nl,然后不断抽,直到nr中没有数字,代表一个排列完成,然后回溯找下一个排列。class Soluti...原创 2019-05-06 12:34:13 · 120 阅读 · 0 评论 -
leetcode78 子集 ★
我的思路:比如求[1,2,3,4]的子集,那么我们先看1只能构成[1],那在1的基础上再加个2,就是[1,2]和[2],所以1和2能构成的总子集为[1],[1,2],[2]。同样地,在1,2的基础上再加3,就是[1,3],[1,2,3],[2,3],[3],所以1和2和3能构成的总子集为[1],[1,2],[2],[1,3],[1,2,3],[2,3],[3]。以此类推即可得解。clas...原创 2019-05-06 22:30:59 · 110 阅读 · 0 评论 -
leetcode300 最长上升子序列 ★(没自己做出来)
补充一个动态规划的思路。分析:首先仔细审题,明确题目中的条件。1、子序列:不要求连续子序列,只要保证元素前后顺序一致即可;2、上升:这里的“上升”是“严格上升”,类似于[2, 3, 3, 6, 7]这样的子序列是不符合要求的;一个序列可能有多个最长上升子序列,题目中只要我们求这个最长的长度。如果使用回溯搜索,选择所有的子序列进行判断,时间复杂度为 $O( (2^n) * n )...原创 2019-05-07 13:24:20 · 155 阅读 · 0 评论 -
leetcode171 Excel表列序号
思路:26进制。class Solution: def titleToNumber(self, s: str) -> int: result=0 for c in s: result=26*result+(ord(c)-64) return result原创 2019-05-07 19:55:05 · 98 阅读 · 0 评论 -
leetcode140 单词拆分 ★
def wordBreak(self, s, wordDict): """ :type s: str :type wordDict: List[str] :rtype: List[str] """ res = [] def wordBreak(): dp = [...原创 2019-05-30 09:54:20 · 167 阅读 · 0 评论 -
leetcode 120 三角形最小路径和 ★
目前只想出空间复杂度O(N*N/2)的方法,代码:class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: for r,row in enumerate(triangle): if r == 0: continue ...原创 2019-06-19 19:35:27 · 90 阅读 · 0 评论 -
leetcode 221 最大正方形 ★
当我们判断以某个点为正方形右下角时最大的正方形时,那它的上方,左方和左上方三个点也一定是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了。这是定性的判断,那具体的最大正方形边长呢?我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,最好的情况是是它的上方,左方和左上方为右下角的正方形的大小都一样的,这样加上该点就可以构成一个更大的正方形。 ...原创 2019-06-20 15:58:13 · 124 阅读 · 0 评论 -
leetcode 746 使用最小花费爬楼梯 ★
这道题有点不好理解,要增加一个地面和楼顶就好理解了。class Solution: def minCostClimbingStairs(self, cost: List[int]) -> int: if cost == None: return 0 elif len(cost) == 1: retu...原创 2019-06-20 17:33:25 · 100 阅读 · 0 评论 -
leetcode 338 比特位计数
思路:对应数字n的二进制中1的位数是有规律的。0的位数为0。1是2的0次幂,2是2的1次幂。因此,只要是2的幂的数的二进制中1的位数都是1。那么对应地,3的二进制中1的位数就是2的位数加上1的位数;同理,7的二进制中1的位数就是4的位数加上3的位数,使用动态规划得解:dp[n]=dp[n-最近的2的幂]+1,其中1代表的是最近的2的幂本身二进制中包含1个1。class Solution: ...原创 2019-06-20 18:12:25 · 124 阅读 · 0 评论 -
剑指45 把数组排成最小的数
思路简单:排序+比较规则:a+b <b+a 则a应该排在b的前面。# -*- coding:utf-8 -*-class Solution: def PrintMinNumber(self, numbers): # write code here '''numbers是由数字组成的列表''' numbers = self.so...原创 2019-06-25 10:34:40 · 151 阅读 · 0 评论 -
leetcode 931 下降路径最小和
思想很简单:动态规划,每个元素代表到达当前位置的最小和。因为最多只能相隔一个位置,所以考虑一下边界情况即可。class Solution: def minFallingPathSum(self, A: List[List[int]]) -> int: n = len(A) # row m = len(A[0]) # col ...原创 2019-06-21 16:24:50 · 172 阅读 · 0 评论 -
剑指7 重建二叉树
思路:递归左子树和右子树,然后赋给根结点# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: # 返回构造的Tr...原创 2019-06-25 14:00:55 · 116 阅读 · 0 评论 -
leetcode 82 删除排序链表中的重复元素 II
这道题思路不难,但是我一共花了1个小时才AC,失败了两次,第三次提交AC,失败在了忘记加newTail.next=None导致pre后面的数也在最终返回的结果中。# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# ...原创 2019-06-24 22:28:21 · 121 阅读 · 0 评论 -
leetcoe236 二叉树的最近公共祖先 ★
我的思路:先分别求出p结点到根节点的路径和q结点到根结点的路径,然后找到最近的公共祖先。其中,如何求得p结点到根结点的路径,需要好好复习一下。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.le...原创 2019-05-27 15:47:18 · 91 阅读 · 0 评论 -
leetcode235 二叉搜索树的最近公共祖先
思路:利用二叉搜索树左子树中所有结点值小于根结点值,右子树中所有结点值大于根结点值的性质。因此,公共祖先就是最近的一左一右的情况,代码很好理解。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.l...原创 2019-05-27 14:10:55 · 211 阅读 · 0 评论 -
leetcode61 旋转链表
思路:这道题我想到的是使用快慢指针,快慢指针相差k个移动的位置,然后进行相应的指针连接即可。# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:...原创 2019-05-13 16:28:53 · 91 阅读 · 0 评论 -
leetcode463 岛屿的周长
本题的最佳思路看起来不难,但我一开始没想出来,即:一次遍历矩阵中所有元素,如果该元素为岛屿则加4,并判断该元素的左边和上边是否为岛屿,如果是则减2。class Solution: def islandPerimeter(self, grid: List[List[int]]) -> int: row = len(grid) column = le...原创 2019-05-11 14:06:15 · 198 阅读 · 0 评论 -
leetcode200 岛屿的个数
典型的回溯法题目。与棋盘问题类似。class Solution: def numIslands(self, grid: List[List[str]]) -> int: def dfs(i,j): if not(0<=i<m) or not(0<=j<n): ret...原创 2019-05-11 14:35:14 · 168 阅读 · 0 评论 -
leetcode83 删除排序链表中的重复元素
思路,因为是排序链表,所以只需要顺序地比较相邻两个元素是否相同,相同则保留前者,不同则继续遍历下个元素。# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solu...原创 2019-05-12 10:33:30 · 75 阅读 · 0 评论