LeetCode
leetcode刷题
Clark_Xu
重新出发,拥抱变化
展开
-
二叉树的前序、中序、后序和层序遍历的非递归实现
class Node(object): def __init__(self, data=-1, lchild=None, rchild=None): self.data = data self.lchild = lchild self.rchild = rchild class Tree(object): def __in...原创 2020-03-23 01:15:35 · 234 阅读 · 0 评论 -
LeetCode之团灭四道搜索旋转数组
搜索旋转数组是面试中很容易考到的题目,我面试次数不多,都已经碰到两次,一次在头条,一次在作业帮。在LeetCode中出现了四道关于搜索旋转数组的题目。LeetCode 33 题:搜索旋转排序数组 LeetCode 81 题:搜索旋转排序数组-ii LeetCode 153 题:寻找旋转排序数组中的最小值 LeetCode 154 题:寻找旋转排序数组中的最小值-ii搜索旋转数组 就是 ...原创 2020-03-20 22:50:16 · 212 阅读 · 0 评论 -
LeetCode72. 编辑距离
题目:给定两个单词word1 和word2,计算出将word1转换成word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符def minDistance(word1: str, word2: str) -> int: wl1 = len(word1)+1 wl2 = len(word2)+...原创 2020-01-30 16:02:29 · 153 阅读 · 1 评论 -
LeetCode217. 存在重复元素
题目:给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。思路:这道题用python中的字典的话就很简单了。那么在c++中,有没有类似的数据结构呢?是有的,STL大法好,(还好我没有用c来刷题),就是 unordered_map了,参考资料:https://www.cnblogs.com/slot...原创 2019-09-15 17:28:58 · 169 阅读 · 0 评论 -
LeetCode88. 合并两个有序数组
题目:给定两个有序整数数组nums1 和 nums2,将 nums2 合并到nums1中,使得num1 成为一个有序数组。说明:初始化nums1 和 nums2 的元素数量分别为m 和 n。你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存 nums2 中的元素。思路:旧思路就是用一个新的数组,然后两个指针同时遍历两个数组,比较每个位置上然后放入...原创 2019-09-15 18:48:53 · 158 阅读 · 0 评论 -
LeetCode53. 最大子序和
题目:给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。思路:思路一:每一个步的结果只和上一步有关,当前值 为上一步的值,和0比较,如果能做出贡献就加上当前值,否则就要重头开始思路二:动态规划,和思路一差不多题解:class Solution {public: int maxSubArray(vector<...原创 2019-09-15 19:46:33 · 126 阅读 · 0 评论 -
LeetCode121. 买卖股票的最佳时机
题目:给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。思路:动态规划题解:一、动态规划(c++)class Solution {public: int maxProfit(vector<int>& ...原创 2019-09-15 19:52:15 · 132 阅读 · 0 评论 -
LeetCode26. 删除排序数组中的重复项
题目:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。思路:用一个计数器count记录独特数字即可。题解:class Solution {public: int removeDuplicates(vector<int>...原创 2019-09-15 19:58:11 · 154 阅读 · 0 评论 -
LeetCode4. 寻找两个有序数组的中位数
题目:给定两个大小为 m 和 n 的有序数组nums1 和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))。你可以假设nums1和nums2不会同时为空。思路:忘数组中加入虚拟#,长度为0~2*n共 2*n+1,让长度恒为奇数,然后还有割点的概念,这个操作太妙,解决了长度为奇数偶数的问题,不用分情况讨论了。参考:https...原创 2019-09-15 20:07:41 · 174 阅读 · 0 评论 -
LeetCode230. 二叉搜索树中第K小的元素
题目:给定一个二叉搜索树,编写一个函数kthSmallest来查找其中第k个最小的元素。题解:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2019-09-15 20:13:33 · 162 阅读 · 0 评论 -
LeetCode235. 二叉搜索树的最近公共祖先
题目:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。题解:# Definition for a binary tree node.# class TreeNode:# d...原创 2019-09-15 20:15:17 · 145 阅读 · 0 评论 -
LeetCode33. 搜索旋转排序数组
题目:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是O(logn) 级别。思路:这个题在头条面试时候问过啊,唉还是要多刷点题。下面是思路的草稿...原创 2019-09-16 08:56:25 · 162 阅读 · 0 评论 -
LeetCode11. 盛最多水的容器
题目:给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。思路:双指针。res = (j - i) * min( h[i] , h[j] ), 盛水面积取决于低的那块板,所以每次只移动低的那...原创 2019-10-08 21:47:00 · 133 阅读 · 0 评论 -
LeetCode292. Nim 游戏
题目:你和你的朋友,两个人一起玩Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。思路:找规律,你先拿,让剩下的数目为4的整数倍,那样,不管对方拿多少,比如拿n个,你就拿4-n个,那样你们总能凑成4,你总能成在最后一个回合中...原创 2019-09-12 08:34:35 · 134 阅读 · 0 评论 -
LeetCode146. LRU缓存机制
题目:运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少...原创 2019-09-12 01:20:41 · 115 阅读 · 0 评论 -
LeetCode20. Valid Parentheses
题目:给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。思路:用栈的思想,用字典形式把左右符号一一对应起来,遍历字符串,如果是左符号就入栈,如果是右符号就判断栈顶是否对应的左符号,如果是,栈顶出栈,如果不是则直接返回false,当然如果一开始就是右符号就直接返回false。遍历完之后看栈内是否还有元素,没有则为true,有则为false。题...原创 2019-08-05 11:58:18 · 111 阅读 · 0 评论 -
LeetCode155. Min Stack
题目:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈(避免审核不通过我就不放完整题目了)思路:用python写,栈用数组实现,一开始是想用一个变量来存最小值,但是那样一旦栈发生了变化,那每次都要查找了,所以再用一个数组(栈)把历史最小元素都存了起来,保持最小的在栈顶(数组最后一个)。题解:class MinStack: def...原创 2019-08-03 22:19:29 · 117 阅读 · 0 评论 -
LeetCode122. 买卖股票的最佳时机 II
题目:给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。思路:贪心思想,只要第i+1天比第i天价格高,就第i天买进,第i+1天卖出,题目没有写明白,能够同一天同时买进卖出,但是我们可以理解为,如果连续升高的,同一天同...原创 2019-08-09 14:17:39 · 93 阅读 · 0 评论 -
LeetCode23. 合并K个排序链表
题目:合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。格式:输入 [[1,4,5],[1,3,4],[2,6]]输出 [1,1,2,3,4,4,5,6]思路:合并几个有序的数组,不就是归并排序。显然用分治的思想。还有可以用堆。题解:方法一:分治(分治大法好)# Definition for singly-linked list.# class...原创 2019-08-07 14:53:45 · 123 阅读 · 0 评论 -
LeetCode148. 排序链表
题目:在O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序。思路:用归并思想,但是链表排序和数组排序有所不同,数组是可以直接拿到中间索引的,而链表得用快慢指针去找。还有这道题要求的时间复杂度和空间负责度要求也比较高,经常超时了题解:这个超时了,还要改进class Solution: def sortList(self, head: Lis...原创 2019-08-10 20:50:12 · 112 阅读 · 0 评论 -
LeetCode231. 2的幂
题目:给定一个整数,编写一个函数来判断它是否是 2 的幂次方。思路:1.迭代法:看一直除是否能除尽2.位运算:先来了解一下位运算# & |# 1&2,2在二进制里面是10,1在二进制中是01,# 那么01与运算10得到是00 输出0 ,01或运算10得到11 ,输出 31 & 2 # 输出为 0, 1 | 2 ...原创 2019-08-15 15:15:22 · 104 阅读 · 0 评论 -
LeetCode104. 二叉树的最大深度
一、题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。二、思路:就是找二叉树的高度,用递归方法和非递归方法三、题解:递归方法:(c++实现)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode...原创 2019-08-15 16:05:53 · 132 阅读 · 0 评论 -
LeetCode78. 子集
题目:给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]思路:一开始看这么复杂的样例,会把思路想复杂,如果我们先举一些简单的例子,只有一个元...原创 2019-08-11 21:40:59 · 139 阅读 · 0 评论 -
LeetCode124. 二叉树中的最大路径和
一、题目:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。二、思路:本题 是理解递归思想的好题!! 有两个亮点,一是int &sumMax 用&来传参sumMax,可以在递归中改变该最大值,以后记得借鉴,二是递归函数maxPSum递归的到底是什么?一定要弄清这个问题,我...原创 2019-08-15 18:37:38 · 213 阅读 · 0 评论 -
LeetCode136. 只出现一次的数字
题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。思路:python里面用的很多的字典做一个word count就行了题解:class Solution: def singleNumber(self, nums: List[int]) -> int: nums_set = set(nums...原创 2019-08-12 15:07:21 · 107 阅读 · 0 评论 -
LeetCode169. 求众数
题目:给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。思路:这个题的思路和前一篇博客一样题解:def majorityElement(nums): nums_set = set(nums) #去重 nums_dict = {} maj = len(nu...原创 2019-08-12 15:18:21 · 194 阅读 · 0 评论 -
LeetCode236. 二叉树的最近公共祖先
题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路:1. 递归解法:(树这种结构真的太适合递归解法了):如果两个节点分别在左右子树,那么公共祖先为根结点,如果两个节点同在一边子树,那么...原创 2019-09-11 16:24:42 · 129 阅读 · 0 评论 -
LeetCode215.Kth Largest Element in an Array
题目:在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。思路:用最大堆,每次取完一个堆顶就重新构建一次。用的是以前写堆排序的代码。题解:class Solution: def findKthLargest(self, nums: List[int], k: int) -> int: ...原创 2019-08-06 12:44:47 · 136 阅读 · 0 评论