
算法学习
Aristocrat l
由于个人学习太过枯燥,同时缺乏方向感,所以今天开始写博客 记录自己的学习生活
展开
-
算法训练——97. 交错字符串
给定三个字符串s1、s2、s3,请你帮忙验证s3是否是由s1和s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + ... + snt = t1 + t2 + ... + tm|n - m| <= 1交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...注意:a + b 意味着字符串 a 和...原创 2022-04-07 11:10:48 · 196 阅读 · 0 评论 -
算法日常——377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例 1:输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)...原创 2022-04-07 09:13:53 · 197 阅读 · 0 评论 -
AQS源码学习
AQS,全称:AbstractQueuedSynchronizer,是JDK提供的一个同步框架,内部维护着FIFO双向队列,即CLH同步队列。AQS依赖它来完成同步状态的管理(voliate修饰的state,用于标志是否持有锁)。如果获取同步状态state失败时,会将当前线程及等待信息等构建成一个Node,将Node放到FIFO队列里,同时阻塞当前线程,当线程将同步状态state释放时,会把FIFO队列中的首节的唤醒,使其获取同步状态state。很多JUC包下的锁都是基于AQS实现的...原创 2022-04-07 11:12:14 · 167 阅读 · 0 评论 -
日常算法——278. 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例 1:...原创 2022-04-06 15:12:27 · 99 阅读 · 0 评论 -
算法训练——力扣518 零钱兑换 II
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。示例 1:输入:amount = 5, coins = [1, 2, 5]输出:4解释:有四种方式可以凑成总金额:5=5...原创 2022-04-05 21:05:58 · 299 阅读 · 0 评论 -
算法训练——力扣474一和零
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。示例 1:输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001...原创 2022-04-05 20:36:30 · 352 阅读 · 0 评论 -
算法训练——最少会议室
每日一道笔试题,同学们可以进行自我测试一下,下午公布参考答案~给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。示例 1:输入:intervals = [[0,30],[5,10],[15,20]]输出:2示例 2:输入:intervals = [[7,10],[2,4]]输出:...原创 2022-04-01 15:30:20 · 1224 阅读 · 0 评论 -
算法训练——数组匹配最多连线数
每⽇⼀道笔试题,同学们可以进⾏⾃我测试⼀下,下午公布参考答案~在两条独⽴的⽔平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制⼀些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满⾜满⾜: nums1[i] == nums2[j] 且绘制的直线不与任何其他连线(⾮⽔平线)相交。 请注意,连线即使在端点也不能相交:每个数字只能属于⼀条连线。 以这种⽅法绘制线条,并返回可以绘制的最⼤连线数。示例1:...原创 2022-04-01 15:24:47 · 471 阅读 · 0 评论 -
算法训练——相似岛屿
每日一道笔试题,同学们可以进行自我测试一下,下午公布参考答案~给定一个非空 01 二维数组表示的网格,一个岛屿由四连通(上、下、左、右四个方向)的 1 组成,你可以认为网格的四周被海水包围。请你计算这个网格中共有多少个形状不同的岛屿。两个岛屿被认为是相同的,当且仅当一个岛屿可以通过平移变换(不可以旋转、翻转)和另一个岛屿重合。示例 1:11000110000001100011给定上图,返回结果 1 。示例 2:11011100000000111011...原创 2022-04-01 15:20:30 · 239 阅读 · 0 评论 -
算法训练——括号匹配
每日一题给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例2:输入:s = "()[]{}"输出:true示例3:输入:s = "(]"输出:false示例4:输入:s = "([)]"输出:false示例5...原创 2022-04-01 15:18:14 · 255 阅读 · 0 评论 -
算法训练——最长两种字节子串
每日一题给定一个字符串 s ,找出至多包含两个不同字符的最长子串 t ,并返回该子串的长度。示例 1:输入: "eceba"输出: 3解释: t 是 "ece",长度为3。示例 2:输入: "ccaabbb"输出: 5解释: t 是 "aabbb",长度为5。解题:滑动窗口public class Day6 { public static void main(String[] args) {// int solution...原创 2022-04-01 15:15:56 · 303 阅读 · 0 评论 -
算法训练——字符串映射
每日一练给你一种规律pattern和一个字符串s,请你判断s是否和pattern的规律相匹配。如果存在单个字符到字符串的 双射映射 ,那么字符串s匹配pattern,即:如果pattern中的每个字符都被它映射到的字符串替换,那么最终的字符串则为 s 。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。示例 1:输入:pattern = "abab", s = "redbluer...原创 2022-04-01 15:13:37 · 1159 阅读 · 0 评论 -
算法训练——最长同步字符串
每日一练给定两个单词word1和word2,返回使得word1和word2相同所需的最小步数。每步可以删除任意一个字符串中的一个字符。示例 1:输入: word1 = "sea", word2 = "eat"输出: 2解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"示例 2:输入:word1 = "leetcode", word2 = "etco"输出:4提示:1 ...原创 2022-04-01 15:11:27 · 148 阅读 · 0 评论 -
力扣494.目标和(动态规划)
推导题意:本题是将数组分为两组,一组是加号,另一组是减号设加数为x,减数为y:x + y = sum;x - y = target;而数组总和可以自己求出来,数组target题目已给,所以可以推出x的值:x = (sum +target)/2;如果后者能除尽则可以用加减号计算出结果,若除有余数则不可能计算出target所以本题转化为动态规划背包问题设一维dp滚动...原创 2022-03-09 11:28:02 · 330 阅读 · 0 评论 -
力扣95.不同的二叉搜索树2(dfs暴力解法)
这题明显可以使用dfs解决分析递推公式:1.当只有一个节点时,直接返回该节点2.当有两个节点时两种情况:1.小节点在上,右孩子为大节点 2.大节点在上,左孩子为小节点3.当有三个节点时三种情况:1.最小的节点在上,中等和最大的节点按照第二种方法排序2.中间节点在上,左右分别按照第一种方法3.最大的节点在上,左节点按照第二种方法排序以此类推,当n个节点时遍历n,当第i个节点作为根...原创 2022-03-08 12:13:16 · 239 阅读 · 0 评论 -
力扣42. 接雨水(双指针解法)
思路:最后无论原图形如何都会形成阶梯型,而每个阶梯型与力扣11.最大盛水容器类似,所以本题选择双指针法,首先查找到最高的一节,然后中心扩散。第一步,找到最高点,left指针与right指针同时指向该点第二步,双指针向左右扩散,找到次高点,计算与left,right之间的容量第三步,继续向左向右找次高点,计算盛水面积第四步继续进行扩散结束,返回总面积。package oneProject;public class Trap...原创 2022-03-08 11:59:38 · 630 阅读 · 0 评论 -
力扣473. 火柴拼正方形(dfs暴力解法)
题目:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。如果你能使这个正方形,则返回 true ,否则返回 false测试1输入: matchsticks = [1,1,2,2,2]输出: true解释: 能拼成一个边长为2的正方形,每边两根火柴。测试2输入: matchsticks = [原创 2022-03-03 09:02:04 · 509 阅读 · 0 评论 -
力扣416.分割等和子集
日常算法打卡416.分割等和子集本题题干:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。事例1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。事例2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。本题可以使用dfs深搜,但是算法复杂度十分高,所以使用动态规划滚动...原创 2022-02-19 23:20:13 · 303 阅读 · 0 评论 -
01背包——滚动数组动态规划优化
在上篇讲述了01背包基础问题,但是代码思想任然存在可优化地方,比如我们可以从递推公式可以看出来:原递推公式当前承重量的背包最大容纳价值 = max(腾出新物品空位后的背包承重量最大价值 + 新物品的价值,不加入新物品的最大价值);dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);原递推思路定义一个二维数组,每一列为从0-max解放的背包重量,每...原创 2022-02-18 13:28:34 · 572 阅读 · 0 评论 -
01背包问题——动态规划详解
有N件物品和⼀个最多能被重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能⽤⼀次,求解将哪些物品装入背包⾥物品价值总和最⼤。 在题目中我们假设有三件物品 重量 价值 物品1 1 15 物品2 3 20 物品3 ...原创 2022-02-17 19:15:07 · 2372 阅读 · 0 评论 -
力扣刷题——98.验证二叉搜索树
日常打卡算法题题目:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:1.节点的左子树只包含 小于 当前节点的数。2.节点的右子树只包含 大于 当前节点的数。3.所有左子树和右子树自身必须也是二叉搜索树。给出了如下二叉树的类定义/** * Definition for a binary tree node. * public class TreeNode { * i...原创 2022-02-12 19:13:58 · 563 阅读 · 0 评论