leetcode
DLC的学习笔记
这个作者很懒,什么都没留下…
展开
-
动态规划(二)
0-1背包问题有一个背包,它的容量为C。现在有n种不同的物品,编号为0…n-1,其中每一件物品的重量为w(i),价值为v(i)。问可以向这个背包中盛放哪些物品,使得在不超过背包容量的基础上,物品的总价值最大。如果按照上面小偷的思路的话,对于将n件物品放入容量为C的背包的最大价值,有以下两种可能:第n件物品不放入,则最大价值等于将n-1件物品放入容量为C的背包的最大价值。第n件物品放入...原创 2020-05-04 21:40:51 · 288 阅读 · 0 评论 -
动态规划(一)
什么是动态规划动态规划就是将原问题拆解成若干个子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。1. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1...原创 2020-04-28 21:14:00 · 276 阅读 · 0 评论 -
递归和回溯
一、树形问题本身没有定义在树中,但解决时发现是树的结构。1.电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。虽然这不是一个树的问题,但是可以转化为一棵树。如下图,通过给定的字符串找对应按键可能出现的字母,然后添加到 StringBuilder里递归。之所以叫做回溯,那是因为在每...原创 2020-04-23 20:05:38 · 528 阅读 · 0 评论 -
二叉树和递归
二叉树的天然递归结构1. 二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。使用一个递归可以轻松解决,那么递归函数的定义为:返回当前二叉树的最大深度所以每个函数内部只需要返回左右子树最大深度+1即可。class Solution { int res; public i...原创 2020-04-10 20:58:52 · 329 阅读 · 0 评论 -
老八秘制二叉树生成器
LeetCode二叉树题目自己测不了,就用老八秘制……写了一个小工具,数组转二叉树:package Tree;import java.util.LinkedList;import java.util.Queue;public class TreeUtils { /** * 将一个数组转为二叉树 * @param nums 传入的数组 * @ret...原创 2020-04-07 21:30:19 · 1419 阅读 · 4 评论 -
队列
二叉树的层次遍历例题:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。使用一个队列,来保存每一层的结点。每次我们从队列中依次取出这一层的所有结点,然后保存它们的值为一个列表,并将它们的左右结点入队。当队列为空的时候,二叉树也就被遍历完了。class Solution { public List<List<Integer&...原创 2020-04-04 20:50:21 · 195 阅读 · 0 评论 -
栈
栈的基本使用例题:有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。很经典的题目,当初第一次做还是个懵懂的少年,现在头发刷刷的掉。利用栈可以很轻松的实现,遇到左括号就进栈,右括号就出栈栈顶元素进行匹配。如果匹配错...原创 2020-04-02 09:48:31 · 149 阅读 · 0 评论 -
链表——不仅仅是穿针引线、双指针
例题:删除链表中的节点请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。说明:-链表至少包含两个节点。-链表中所有节点的值都是唯一的。-给定的节点为非末尾节点并且一定是链表中的一个有效节点。-不要从你的函数中返回任何结果。这个,,似乎没什么难度啊,咋还不仅仅是穿针引线呢?看到函数我突然明白了,并不是给你一个链表再给你一个值把它删掉,而是删...原创 2020-03-31 22:24:40 · 173 阅读 · 0 评论 -
链表——复杂的穿针引线
例题:两两交换链表中的节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。使用四个指针,node1和node2分别指向要交换的两个结点,pre指向node1前一个结点,next指向node2后一个结点。交换node1和node2的操作:node2.next = node1;node1.next = next;...原创 2020-03-30 22:19:15 · 163 阅读 · 0 评论 -
链表——虚拟头结点
例题:移除链表元素删除链表中等于给定值 val 的所有节点。看上去似乎很简单,一个指针cur向后遍历,遇到cur.next.val==val便通过cur.next = cur.next.next删除它。直到cur.next.val!=val,再执行cur = cur.next。但是,那这样头结点怎么办呢?所以要使用一个虚拟头结点。class Solution { public ...原创 2020-03-29 21:28:38 · 1236 阅读 · 0 评论 -
链表——在节点间穿针引线
例题:反转链表反转链表原理很简单,就是将原本指向下一个结点的指针,指向上一个结点。但是,需要存储前面和后面的结点,要不就找不到了。所以使用pre cur next三个结点,存储着上一个结点、当前结点、下一个结点,然后一起向后遍历。在这期间,最需要注意的就是顺序以及边界。class Solution { public ListNode reverseList(ListNode head...原创 2020-03-28 22:02:12 · 229 阅读 · 0 评论 -
查找表+滑动窗口
例题:存在重复元素II给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。·i和j差的绝对值至多为k的话,那么可以使用一个大小固定为k+1的滑动窗口,只要这个窗口内有重复的元素,那就说明符合题意,返回true。如果遍历完都找不到,返回false。由于不需要统计次数,所以使...原创 2020-03-26 17:42:02 · 208 阅读 · 0 评论 -
使用查找表的经典问题
例题1:两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。使用查找集的做法就是,将所有元素以及对应下标都放入map中,然后查找每一个target-a是否存在于map,在的话返回a以及target-a的下标值。但是,如果有两个相同...原创 2020-03-25 20:24:46 · 237 阅读 · 0 评论 -
查找问题
一、查找有无:使用set例题:给定两个数组,编写一个函数来计算它们的交集。将nums1的元素放到一个set里,然后逐一判断nums2中的元素,存在的就是交集元素。二、查找关系:使用map例题:求两个数组的交集,并且要输出结果中每个元素出现的次数。使用map来记录nums1中元素的出现次数,然后判断nums2元素是否在map中,在则map中次数减一。1.有效的字母异位词给...原创 2020-03-21 21:54:17 · 136 阅读 · 0 评论 -
数组--滑动窗口
滑动窗口大多用于处理连续子数组问题,然后得到相应的长度。例题:长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。思路:使用滑动窗口i在左边,j在右边,明确意义[i,j]为滑动窗口(闭区间)。如果滑动窗口内的和小于s,则j++来扩大窗口范围。否则说明达到题目要求,记录此时的长度...原创 2020-03-19 21:06:02 · 696 阅读 · 0 评论 -
数组--对撞指针
例题:两数之和给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。思路:由于数组是升序排列的,所以利用对撞指针,i从左向右,...原创 2020-03-19 14:07:26 · 186 阅读 · 0 评论 -
数组--基础算法思路的应用
例题:颜色分类给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意: 不能使用代码库中的排序函数来解决这道题。首先,最简单的思路是使用计数排序,因为只有三个元素。其次,可以使用三路快排思想。维护三个指针 zero ,i, two,让它们满...原创 2020-03-18 21:21:54 · 147 阅读 · 0 评论 -
数组--明白变量的含义是什么
例题:移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。使用两个指针i和j,i用来遍历数组,j用来统计非零元素个数,每次将num[i]的值赋值给num[j],最后将j后面的元素清0即可。1.移...原创 2020-03-18 19:42:39 · 339 阅读 · 0 评论 -
三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。思路一:首先...原创 2020-03-15 11:23:54 · 103 阅读 · 0 评论 -
四数相加 II
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] +C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。思路:查找集最近在跟着慕课网学《玩转算法面试》,所以就没怎么刷题。这个题是课上讲的例题,相比于其他题目,这个题将组合后的值放...原创 2020-03-10 11:29:28 · 134 阅读 · 0 评论 -
零钱兑换
给定不同面额的硬币 coins 和一个总金额amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1示例 2: 输入: coins = [2], amount = 3 输出: -1说明: 你可以认为...原创 2020-03-07 20:43:08 · 237 阅读 · 0 评论 -
最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是4。说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。 进阶:你能将算法的时间复杂度降低到 O(nlogn) 吗?思路一:动态规划难得...原创 2020-03-06 12:18:42 · 339 阅读 · 0 评论 -
寻找重复数
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1 输入: [1,3,4,2,2] 输出: 2示例 2: 输入: [3,1,3,4,2] 输出: 3 说明:不能更改原数组(假设数组是只读的)。 只能使用额外的 O(1) 的空间。 时间复杂度小于 O(n2) 。数组...原创 2020-03-05 21:19:18 · 149 阅读 · 0 评论 -
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。思路一:冒泡法利用冒泡排序的思路,把0一个一个的都冒到数组的末尾。时间复杂度:O(n2)空间复杂度:O(1)class Solution {...原创 2020-03-05 20:30:48 · 129 阅读 · 0 评论 -
完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。思路一:动态规划本来我也是自己在想动态规划的做法,有思路了,可是过于复杂。在写代码的时候就在想,动态规划不是都挺短的代码吗,怎么我的逻辑这么长,会不会是我错了。看了看题解,发现确实是错了(倒也没错,就是太复杂,没找对正确的状态方程)。首先初始化长度为n+...原创 2020-03-05 14:07:11 · 172 阅读 · 0 评论 -
搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[1...原创 2020-03-04 22:10:50 · 242 阅读 · 0 评论 -
滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。提示:你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。进阶:你能在线性时间复杂度内解决此题吗?思路一:我自己的思路就是很暴力,利用一个链表来表示滑动窗口,通过入队和出...原创 2020-03-03 13:10:24 · 130 阅读 · 0 评论 -
除自身以外数组的乘积
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4] 输出: [24,12,8,6] 说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶: 你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组...原创 2020-03-03 11:08:26 · 228 阅读 · 0 评论 -
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,...原创 2020-03-02 21:43:49 · 113 阅读 · 0 评论 -
回文链表
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?实现功能很简单,这道题难就难在怎么才能不使用额外的空间,达到O(1)的空间复杂度。鉴于题解中的递归法太过长,我觉得我根本看不懂,所以,采用另一种方法:双指...原创 2020-03-02 20:25:50 · 119 阅读 · 0 评论 -
最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4思路一:暴力美学直接从左上角遍历所有元素,遇到1,就开始判断它的最大正方形:设置一个len,初始值为1,代表这个正方形的边长;设置标志位flag,一旦在检测过程中发现了0,就置为false;然...原创 2020-03-01 14:40:45 · 150 阅读 · 0 评论 -
数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。这道题最简单的方法肯定就是用Arra...原创 2020-03-01 11:39:17 · 278 阅读 · 0 评论 -
实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 truetrie.search(“app”); // 返回 falsetrie.startsWith(“app”);...原创 2020-03-01 11:13:45 · 196 阅读 · 0 评论 -
课程表
现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]] 输出: true 解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。...原创 2020-02-28 22:05:30 · 276 阅读 · 0 评论 -
反转链表
反转一个单链表。进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?思路一:递归链表的反转,用递归的思想。假设当前节点为A,链表为A+B,则只需要将A插在已经反转好的B后面即可实现A+B的反转。自己写的代码,很糙:时间复杂度:O(n^2),因为每次递归都会循环一次链表空间复杂度:O(n),每次递归会创建三个ListNode实例class Solution { ...原创 2020-02-28 16:09:32 · 94 阅读 · 0 评论 -
岛屿数量
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3思路一:深度优先遍历将二维网格看成一个无向图,然后相...原创 2020-02-28 13:27:55 · 149 阅读 · 0 评论 -
打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。思路一:通过观察题目,分析其要求,可以很明确的知道,这是一个动态规划题目。使用f(n)来表示从前n家中偷盗...原创 2020-02-26 21:55:50 · 141 阅读 · 0 评论 -
多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。思路一:自己的思路,估计也是最容易想到而且效率最低的。就是通过一个HashMap来存储每个key出现的次数。不过通过编写这个,我了解了Map的遍历方式。也就是通过遍历Map中的Entry来获取key和value。时间复杂度:...原创 2020-02-26 21:28:55 · 117 阅读 · 0 评论 -
相交链表
编写一个程序,找到两个单链表相交的起始节点。注意:如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。思路一:暴力法将A链中每个节点都和B中每个节点相比。时间复杂度:O(mn)空间复杂度:O(1)思路二:使用哈希表将A链中的节点都存到一个哈希表中,然后...原创 2020-02-25 17:36:30 · 95 阅读 · 0 评论 -
最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() –检索栈中的最小元素。思路一:本题的关键在于在常数时间内检索到最小元素。所以要用空间换时间,思路一采用辅助栈的方式来做。主栈存储数据,辅助栈的栈顶存储当前栈内的最小元素。辅助...原创 2020-02-25 14:33:52 · 80 阅读 · 0 评论