![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 94
梨子栗子狸
这个作者很懒,什么都没留下…
展开
-
课程表
思路1:BFS 分析题目可知,某些选修课程是有选秀前提的,即必需要先完成某门课程。我们可以将课程之间的关系用有向无环图表示,判断是否可能学完所有课程就意味着这个图中不能有环,试想如果课程A与课程B构成一个环,那么他们就互为彼此的先修课程,显然这是不对的。 下面介绍一下拓扑排序,拓扑排序是针对有向无环图而言的,是一个由有向无环图中的所有顶点组成的序列,这个序列有以下要求: 1. 每个顶点在序列当中且只能出现一次。 2. 若顶点A在序列中,且在B之前,那么在图中不可能存在一条由B到A的路径。 .原创 2020-07-24 21:09:26 · 123 阅读 · 0 评论 -
二叉树展开为链表
思路一 将每个结点的右子树插到其左子树的最右边的位置,然后将左子树换到右子树的位置,将左子树置空。 class Solution { public void flatten(TreeNode root) { if(root==null) return; while(root!=null){ if(root.left==null){ root=root.right; }else{ .原创 2020-07-12 22:58:33 · 76 阅读 · 0 评论 -
由前序和中序序列构造二叉树
思路: 在前序序列中找根结点,利用根结点将中序序列分成两部分(分别是左、右子树)。然后找到左子树的根结点和右子树的根结点,然后再将中序序列已经分好的两部分进行分割,一直递归下去,直到没有子树存在。 class Solution { HashMap<Integer,Integer> map=new HashMap<>(); int[] po; public TreeNode buildTree(int[] preorder, int[] inorder) .原创 2020-07-11 23:05:08 · 2400 阅读 · 0 评论 -
把二叉搜索树转化为累加树
思路: 二叉搜索树是一棵有序树,其任意根结点的值大于其左结点,且小于右结点的值,需要注意的是本题中所有结点都是严格大于或小于的。基于搜索二叉树的这个性质我们容易想到,要找大于任意根结点的值只需找其右子树,我们可以管理一个全局变量用于记录大于当前结点的所有结点的累加和,并且使用右-根-左的方式对二叉树进行遍历。 //递归 class Solution { int sum=0; public TreeNode convertBST(TreeNode root) { if(roo.原创 2020-07-09 22:11:14 · 162 阅读 · 0 评论 -
合并二叉树
思路: 同时对两棵树进行递归,递归过程中可能出现的情况有以下几种: 当前两个结点有一个为空一个不为空,则此时返回不为空的结点,无需再进行递归。 当前两个结点均不为空,则新建一个结点作为根结点,其值为当前两个结点的和。然后对这个新的根结点进行递归,创建其左、右子树。 若当前两个结点均为空,则返回null。 class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if(t1==null||t2=.原创 2020-07-08 10:57:18 · 254 阅读 · 0 评论 -
反转一棵二叉树
思路:首先按层访问二叉树,反转每个结点的左、右子树即可。我们可以使用队列完成按层访问的目的 //迭代实现 class Solution { public TreeNode invertTree(TreeNode root) { TreeNode p=root; if(root==null) return root; LinkedList<TreeNode> queue=new LinkedList<>()原创 2020-07-04 21:38:34 · 183 阅读 · 0 评论 -
二叉树的最大深度
题目描述 思路一:递归 首先要清楚树的高度在数值上等于树的深度。 每到一个结点求当前结点的左子树和右子树高度,如果当前结点为空,则意味着以当前节点为根结点的树不存在高度为0,返回0。如果当前结点不为空,则分别进入其左、右子树,计算左、右子树的高度,并返回最大高度加1。加一是因为返回的高度是左、右子树的高度,加的1代表子树根结点的高度。 //递归实现 class Solution { public int maxDepth(TreeNode root) { if(root==nu原创 2020-07-04 21:14:54 · 157 阅读 · 0 评论 -
螺旋矩阵Ⅰ、Ⅱ
螺旋矩阵 II 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路:我们可以为此矩阵设置上、下、左、右边界,填完一行或一列,响应的边界就向中心收缩,左边界的初始值为0,右边界的初始值为(横向数组的长原创 2020-06-25 22:56:02 · 104 阅读 · 0 评论 -
无重复字符的最长字串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”...原创 2020-04-04 00:09:22 · 83 阅读 · 0 评论 -
两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 ->...原创 2020-04-03 22:17:20 · 74 阅读 · 0 评论 -
回文链表
题目描述:检查一个链表是否为回文链表。 法一:数组+双指针 将链表的值赋值到数组,采用双指针的方式比较头尾的值。 时间复杂度O(n),空间复杂度O(n)。 class Solution { public boolean isPalindrome(ListNode head) { if(head==null||head.next==null) ...原创 2020-04-01 23:05:54 · 74 阅读 · 0 评论 -
反转链表
法一:迭代 class Solution { public ListNode reverseList(ListNode head) { ListNode cur=head; ListNode pre=null; ListNode temp; while(cur!=null){ temp=cur.next...原创 2020-03-31 22:31:24 · 59 阅读 · 0 评论 -
打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 1: 输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 ...原创 2020-03-31 18:37:57 · 125 阅读 · 0 评论 -
多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority...原创 2020-03-31 09:50:41 · 68 阅读 · 0 评论 -
相交链表
编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 思路: 假设链表A的长度为a,链表B的长度为b,相交后的链表长度为c。初始化pa、pb两个工作指针分别为A、B链表的头节点,分别遍历链表,当遍历到C链表尾部时,再分别赋值pa=B链表头节点,pb=A链表头节点。如若两个链表相交则终会有一刻两工作指针指向同一结点。这是为什么呢?可以作如下思考:相交则有a+c+b+c=b+c+...原创 2020-03-30 17:09:01 · 111 阅读 · 1 评论 -
只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 法一:暴力双重循环(时间复杂度O(n^2)) class Solution { public int si...原创 2020-03-28 22:23:55 · 51 阅读 · 0 评论 -
环形链表
给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1...原创 2020-03-27 16:36:18 · 57 阅读 · 0 评论 -
爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1 阶 + 1 阶 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶 ...原创 2020-03-26 21:36:41 · 52 阅读 · 0 评论 -
最大子序列
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 class Solution { public int maxSubArray(int[] nums) { int cur=nums...原创 2020-03-26 11:07:33 · 47 阅读 · 0 评论 -
下一个数更大
问题描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。 nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。 示例: 输入: nums1 = [4,1,2], nums...原创 2020-02-12 21:12:30 · 164 阅读 · 0 评论 -
合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ...原创 2020-03-25 23:08:46 · 118 阅读 · 0 评论