
Leetcode
Leecode题目记录
Fire Code
Java基础知识点总结:https://www.cnblogs.com/firecode7/
展开
-
4、寻找两个正序数组的中位数
题目描述:给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。方法一:暴力法方法二:暴力法优化版方法三:二分查找方法四:划分数组...原创 2020-08-03 22:20:31 · 217 阅读 · 0 评论 -
3、无重复字符的最长子串
题目:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。方法一:哈希法思路:从下标0开始逐个取出字符串的字符,将字符作为key,下标作为value存入map中,然后下标逐渐增加,同时更新最长不重复子串的长度,即为map的size和length自身较大的。当map中包含该下标对应的key,即出现重复元素时,则将遍历下标移至map中存储的当前字符的下一个字符开始从新遍历搜索,同时要清空map,便于找下一个重复字符。public int lengthOfLongestSubstring(Strin原创 2020-07-22 23:03:36 · 139 阅读 · 0 评论 -
2、两数相加
题目:给出两个非空的链表用来表示两个非负的整数。其中它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。算法思路: 就像你在纸上计算两个数字的和那样,我们首先从最低有效位也就是列表 l1 和 l2 的表头开始相加。由于每位数字都应当处于 0…9 的范围内,我们计算两个数字的和时可能会出现 “溢出”。例如,5+7=12。在这种情况下,我们会将当前位的数值原创 2020-07-17 22:33:55 · 125 阅读 · 0 评论 -
1、两数之和
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。方法一:暴力法暴力法很简单,遍历每个元素 x,并查找是否存在一个值与 target - x相等的目标元素。 public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; for (int原创 2020-07-13 22:40:24 · 101 阅读 · 0 评论 -
面试题 17.13、恢复空格
题目:你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!" 已经变成了"iresetthecomputeritstilldidntboot"。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。方法一:动态规划解题思路: dp原创 2020-07-10 21:51:46 · 296 阅读 · 0 评论 -
剑指 Offer 09、用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )题解: 维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作。根据栈先进后出的特性,我们每次往第一个栈里插入元素后,第一个栈的顶部元素是最后插入的元素,第一个栈的底部元素是下一个待删除的元素,而栈删除元素只能从顶部删除,即后进先出原则。为了维护队列先进先出的特性,我们引入第二原创 2020-07-09 16:25:20 · 85 阅读 · 0 评论 -
209、长度最小的子数组
题目:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。方法一:暴力法 暴力法是最直观的方法。初始化子数组的最小长度为无穷大,枚举数组nums中的每个下标作为子数组的开始下标对于每个开始下标 i,需要找到大于或等于 i 的最小下标 j,使得从nums[i] 到nums[j] 的元素和大于或等于 s并更新子数组的最小长度(此时子数组的长度是 j-i+1)。一直枚举到给定数组最后一个元素的小标作原创 2020-07-09 16:13:31 · 194 阅读 · 0 评论 -
44、通配符匹配
题目: 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。方法一:动态规划 在给定的模式 p 中,只会有三种类型的字符出现,其中「小写字母」和「问号」的匹配是确定的,而「星号」的匹配是不确定的,因此我们需要枚举所有的原创 2020-07-09 10:58:00 · 685 阅读 · 0 评论 -
16.11、跳水板
题目:你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。题解首先考虑两种边界情况。如果 k=0,则不能建造任何跳水板,因此返回空数组。如果 shorter和 longer 相等,则建造的跳水板的长度是唯一的,都等于 shorter* k,因此返回长度为 1 的数组,数组中的元素为 shorter*k。然后考虑一般情况,即 shorte原创 2020-07-08 22:15:11 · 197 阅读 · 0 评论 -
112.、路径总和
题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。方法一:广度优先搜索思路:首先我们可以想到使用广度优先搜索的方式,记录从根节点到当前节点的路径和,以防止重复计算。这样我们使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和即可。定义了一个TreeNode类作为树的节点:class TreeNode { int val; TreeNode left; Tre原创 2020-07-08 09:41:30 · 154 阅读 · 0 评论 -
63、不同路径 II
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍物和空位置分别用 1 和 0 来表示。 说明:m 和 n 的值均不超过 100。动态规划 我们用 f(i,j) 来表示从坐标 (0,0) 到坐标 (i,j) 的路径总数,u(i,j) 表示坐标(i,j) 是否可行,如果坐标原创 2020-07-07 08:46:32 · 335 阅读 · 0 评论 -
32、最长有效括号
题目:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。方法1 不利用其他存储空间 在此方法中,我们利用两个计数器 left 和 right 。首先,我们从左到右遍历字符串,对于遇到的每个 ‘(’,我们增加 left 计数器,对于遇到的每个 ‘)’ ,我们增加 right 计数器。每当 left 计数器与 right 计数器相等时,我们计算当前有效字符串的长度,并且记录目前为止找到的最长子字符串。当 right 计数器比 left 计数器大时,我们将 left 和 ri原创 2020-07-05 10:36:40 · 129 阅读 · 0 评论 -
378、有序矩阵中第K小的元素
题目:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素归并排序思路及算法 由题目给出的性质可知,这个矩阵的每一行均为一个有序数组。问题即转化为从这 n 个有序数组中找第 k 大的数,可以想到利用归并排序的做法,归并到第 k 个数即可停止。一般归并排序是两个数组归并,而本题是 nn 个数组归并,所以需要用小根堆维护,以优化时间复杂度。public int kthSmallest2(int[][] matrix, int k){ Priorit原创 2020-07-04 18:08:33 · 2311 阅读 · 1 评论 -
108、将有序数组转换为高度平衡二叉搜索树
此题首先可以确定选用的算法是递归对于二叉搜索树我们可以知道其左叶子节点值<根节点值<右叶子节点值,故二叉搜索树的中序遍历为一个升序数组。即题目给的有序数组。中序遍历:先遍历左子树,在遍历根节点,最后遍历右子树。如果不要求为平衡二叉搜索树的话,仅由一个升序数组,树的根节点就有多种不同的取值,就会产生很多个不同的二叉搜索树。如当升序数组为:[-10,-3,0,5,9]时,几种可能的情况为(还有其他情况,可以自己看一下,比较特殊):如果要求为平衡二叉搜索树的话,即左右子树的最大高度差要小原创 2020-07-04 17:00:37 · 224 阅读 · 0 评论 -
718、求两个数组中公共的、长度最长的子数组的长度
方法一:动态规划 时间复杂度: O(N×M)。 空间复杂度: O(N×M)。 N 表示数组 A 的长度,M 表示数组 B 的长度。 空间复杂度还可以再优化,利用滚动数组可以优化到 O(min(N,M))。代码实现:public int findLength(int []A,int []B){ int n = A.length, m = B.length; int[][] dp = new int[n + 1][m + 1]; int ans =原创 2020-07-02 09:49:46 · 1523 阅读 · 1 评论