自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 收藏
  • 关注

原创 Python 直接赋值、浅拷贝和深度拷贝

Python 直接赋值、浅拷贝和深度拷贝直接赋值:保存的是引用。b = a: 赋值引用,a 和 b 都指向同一个对象。浅拷贝(copy):保存的是父对象,不会拷贝对象的内部的子对象。b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象,源对象和拷贝出来的对象是完全独立的。b = copy.deepcopy(a): 深度拷贝, a 和 b

2021-09-24 09:43:23 169

原创 序列自动机

序列自动机时间复杂度:O(m×∣Σ∣+d×n)空间复杂度:O(m×∣Σ∣)import java.util.Arrays;import java.util.List;public class Solution { /** * 该函数用于生成一个字符串的序列自动机 * * 序列自动机是接收且仅接收一个字符串的子字符串的子序列的自动机 * 若字符串 targetSequence 包含 n 个字符,那么序列自动机包含 n + 1个状态 * sequentialAut

2021-09-15 22:51:40 172

原创 LeetCode--470. 用 Rand7() 实现 Rand10()

470. 用 Rand7() 实现 Rand10()思路: 7 < 10我们需要扩充Rand7(),让使用Rand7()组合成的RandX的范围大于Rand10()。(此处RandX()范围均为[1-X])如何扩充?1 Rand7() + Rand7()。产生的结果是在1-14正太分布,不符合2 Rand7() * Rand7()产生的结果是在1-49正太分布,不符合3 (rand7()-1) × 7 + rand7()可以等概率的生成1-49的数字已知 rand_N() 可以

2021-09-05 20:33:44 148

原创 LeetCode--剑指 Offer 22. 链表中倒数第k个节点

剑指 Offer 22. 链表中倒数第k个节点环形队列,顺序查找(还可以使用双指针进一步优化内存)public class SolutionJz22 { public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode getKthFromEnd(ListNode head, int k) {

2021-09-02 03:21:05 169

原创 LeetCode--165. 比较版本号

165. 比较版本号public class Solution165 { public int compareVersion(String version1, String version2) { String[] v1List = version1.split("\\."); String[] v2List = version2.split("\\."); for (int i = 0; i < v1List.length || i <

2021-09-01 08:09:29 107

原创 LeetCode--1109. 航班预订统计

1109. 航班预订统计思路:数组不变,区间查询:前缀和、树状数组、线段树;数组单点修改,区间查询:树状数组、线段树;数组区间修改,单点查询:差分、线段树;数组区间修改,区间查询:线段树。本题目使用差分数组即可/** * 1109. 航班预订统计 * */public class Solution1109 { public int[] corpFlightBookings(int[][] bookings, int n) { int[] differenceList

2021-08-31 11:02:15 96

原创 LeetCode--881. 救生艇

881. 救生艇思路:贪心将数组排序,从最大值开始,如果最大值小于限制,检查最小值加上最大值是否依然小于限制,如果是,这两个可以组合成一对,如果不是,最大值单独成一对。从大到小依次进行。import java.util.ArrayDeque;import java.util.Arrays;import java.util.Deque;public class Solution881 { public int numRescueBoats(int[] people, int limit) {

2021-08-26 10:22:51 69

原创 LeetCode--797. 所有可能的路径

797. 所有可能的路径思路:DFS搜索即可import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Deque;import java.util.List;/** * 797. 所有可能的路径 */public class Solution797 { public List<List<Integer>> allPathsSourceTarget(int[][] graph

2021-08-25 10:46:28 111

原创 LeetCode--576. 出界的路径数

576. 出界的路径数思路:动态规划每一点的路径数都是由上一步的路径数目转移过来的从起始点开始,记录每一点的可达路径数目在从各个点扩展搜索的时候如果出界,将该点可达的路径数目记录/** * 576. 出界的路径数 * */public class Solution576 { private static final int MOD = 1_000_000_007; // 方向数组,向四个方向行走 private static final int[][] directio

2021-08-23 15:18:14 132

原创 LeetCode--1646. 获取生成数组中的最大值

1646. 获取生成数组中的最大值/** * 1646. 获取生成数组中的最大值 * */public class Solution1646 { public int getMaximumGenerated(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } int max = 1;

2021-08-23 08:28:56 80

原创 LeetCode--789. 逃脱阻碍者

789. 逃脱阻碍者思路:这道题采用的是曼哈顿距离出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。在平面上,坐标(x1,y1)的i点与坐标(x2,y2)的j点的曼哈顿距离为:d(i,j)=|X1-X2|+|Y1-Y2|.采用各个点到终点的曼哈顿距离作为比较的方式,如果阻碍着能够提前到达终点,那么他就可以在终点等待,无论如何都无法成功离开。如果我们可以提前到达终

2021-08-22 21:39:05 86

原创 LeetCode--443. 压缩字符串

443. 压缩字符串方法:双指针wire: 记录写的地方read: 记录读的位置left:读取的字符串最左边的位置,代表第一个字符获取重复的字符串长度后,取余放入数组中,此时字符串长度是倒置的,需要反转后重新放入数组注意,所有操作都在原数组中完成,不开辟额外的空间public class Solution443 { public int compress(char[] chars) { int n = chars.length; int write

2021-08-22 18:21:40 49

原创 LeetCode--541. 反转字符串 II

/** * 541. 反转字符串 II * */public class Solution541 { public String reverseStr(String s, int k) { char[] chars = s.toCharArray(); int length = chars.length; // 如果剩余字符少于 k 个,则将剩余字符全部反转。 //如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个

2021-08-22 14:09:12 54

原创 LeetCode--345. 反转字符串中的元音字母

345. 反转字符串中的元音字母/** * 345. 反转字符串中的元音字母 * */public class Solution345 { public String reverseVowels(String s) { char[] chars = s.toCharArray(); int i = 0; int j = chars.length - 1; while (i < j) { while(i < j) {

2021-08-19 09:20:17 79

原创 LeetCode--552. 学生出勤记录 II

552. 学生出勤记录 II思路:动态规划列出状态转移列表即可,每一天的状态只能由前一天的状态转移过来/** * 552. 学生出勤记录 II * */public class Solution552 { private static final int MOD = 1_000_000_007; public int checkRecord(int n) { // 三维dp数组 // 第一维:当前的天数 // 第二维:代表以前数组中存在A的个数,A只能有1个

2021-08-18 20:36:38 66

原创 LeetCode--233. 数字 1 的个数

233. 数字 1 的个数分析:https://blog.csdn.net/qq_39611310/article/details/119772883/** * 233. 数字 1 的个数 */public class Solution233 { public int countDigitOne(int n) { int res = 0; long mulk = 1; while (n >= mulk) { res += (n / (mulk * 1

2021-08-18 09:57:33 62

原创 LeetCode--剑指 Offer 43. 1~n 整数中 1 出现的次数

剑指 Offer 43. 1~n 整数中 1 出现的次数思路:枚举每一数位上 1 的个数公式:比如:计算321统计10位上出现的1的次数1.对于从0开始的每100个数,十位上的1都会出现10次,321拥有3个这样的循环,每个循环 十位 上都出现了10次1,一共出现了30次1,这部分为⌊ 321/100 ⌋×102.对于不完整的循环,存在三种情况,305:十位为0,不会出现1,315:十位为1,不完全出现1,会出现15 - 10 + 1个1325:则会出现全部的1计算时可以用取余数的

2021-08-18 09:48:47 96

原创 LeetCode--551. 学生出勤记录 I

/***551. 学生出勤记录 I*/class Solution { public boolean checkRecord(String s) { return s.indexOf("A", s.indexOf("A") + 1) == -1 && !s.contains("LLL"); }}

2021-08-17 09:27:20 59

原创 LeeetCode--526. 优美的排列

526. 优美的排列思路:动态规划 + 状态压缩状态压缩:最多的数字个数是15,所以可以使用一个int型变量,每一位代表是否选择当前数字。mask代表选取的位置,由于是由0位开始的,所以第i位实际上是第i+1位数字。动态规划:每一次选取后,下一次选取在该次选取的基础上再次选取。状态转移方程当我们想要计算当前的f[mask]时,需要把前num(mask - 1) 放置好,,最后再将本次计算结果累加上去。我们需要依次枚举本次可以被放置的数,最后加起来。最终的结果在f[2^n - 1] 这里呈

2021-08-16 08:27:18 89

原创 LeetCode--413. 等差数列划分

413. 等差数列划分思路:滑动窗口如何理解每一次贡献值自增?在三个数情况下| | |Ans = 1在四个数情况下| | | |Ans = 1 + 2在五个数情况下| | | | |Ans = 1 + 2 + 3可以看到,每一次数列长度递增,贡献值增加的是上次增加的值+1/** * 413. 等差数列划分 * */public class Solution413 { public int numberO

2021-08-12 14:35:36 59

原创 LeetCoode--516. 最长回文子序列

516. 最长回文子序列思路:动态规划注意:是求动态子序列(不是子串)动态规划需要从后向前遍历(保持状态转移方程正确性)只有一个字符时一定可以形成子序列/** * 516. 最长回文子序列 * */public class Solution516 { public int longestPalindromeSubseq(String s) { int len = s.length(); char[] chars = s.toCharArray(); int

2021-08-12 09:41:02 42

原创 LeetCode--457. 环形数组是否存在循环

457. 环形数组是否存在循环思路:快慢指针1 需要依次以每一个点作为起点,检查是否符合要求,即从该点出发可以进入一个循环2 根据题目描述,从起点开始每一次所走的方向必须是一致的,所以我们需要每一次检查到达点的下一步方向是否和当前行进的方向一致3 需要随时判断下一次点是否是一个自循环的点,如果是,则判断不符合条件4 在一个点判断完成后,将该点路径上所经过的所有的点的值都设置为0,代表已经走过。/** * 457. 环形数组是否存在循环 */public class Solution457

2021-08-08 19:33:32 70

原创 LeetCode--1137 第 N 个泰波那契数

##1137 第 N 个泰波那契数思路:动态规划:每一个数字的状态取决于前三个数字,采用滚动数组优化内存/** * 1137 第 N 个泰波那契数 */public class Solution1137 { public int tribonacci(int n) { if (n == 0 ) { return 0; } else if (n <= 2) { return 1; } else { int T1 = 0, T2 = 1, T3 = 1, T4

2021-08-08 17:05:12 44

原创 LeetCode--802. 找到最终的安全状态

找到最终的安全状态思路:根据题目描述,从一个节点出发,只要找不到环路,就可以判断该节点为一个安全节点如何判断是否存在环路呢?可以采用经典的三色算法从一点出发,执行DFS搜索,每次经过一个节点,就给该节点染色。若在搜索中到达了某节点发现该节点已经被染色过,则证明存在环路。当前点未访问过:设置为0(白色)当前点第一次访:设置为1(灰色)当前点最终只被访问一次:设置为2(黑色)安全节点就是黑色节点/*4. 找到最终的安全状态 */import java.text.SimpleDate

2021-08-05 20:17:26 112

原创 LeetCode--581. 最短无序连续子数组

581. 最短无序连续子数组思路:中间是无序数组,那么除去中间数组之外,左右两边必定是有序数组。无序数组中最大的值,必定小于其右侧数组最小值无序数组中最小的值,必定大于其左侧数组最大值/** * 581. 最短无序连续子数组 */public class Solution581 { public int findUnsortedSubarray(int[] nums) { int length = nums.length; int maxn = Int

2021-08-03 03:34:22 152

原创 LeetCode--1337. 矩阵中战斗力最弱的 K 行

/*1337. 矩阵中战斗力最弱的 K 行 */import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class Solution1337 { public int[] kWeakestRows(int[][] mat, int k) { List<int[]> resList = n

2021-08-01 10:06:07 76

原创 LeetCode--1104. 二叉树寻路

1104. 二叉树寻路前置知识点:二叉树的性质性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。性质3:包含n个结点的二叉树的高度至少为log2 (n+1)。性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。数组存放二叉树的性质:设某个节点索引值为index,则节点的左子节点索引为:2index+1右子节点索引为:2index+2父节点索引为:(index-1)/2

2021-07-30 20:24:55 76

原创 LeetCode--171. Excel表列序号

#171. Excel表列序号思路:简单的进制转换,注意A是1,不是0,要加1即可/** * 171. Excel表列序号 * */public class Solution171 { public int titleToNumber(String s) { int res = 0; char[] chars = s.toCharArray(); for (char ch : chars) { int temp

2021-07-30 01:59:56 52

原创 LeetCode--863. 二叉树中所有距离为 K 的结点

863. 二叉树中所有距离为 K 的结点思路:1、DFS查找指定节点,记录一路上的父节点(DFS查找指定节点会将父节点压入栈,在找到指定节点回退时可以记录从指定节点到最上层父节点的路径)2、将指定节点与父节点依次取出,DFS查询指定深度节点3、剪枝操作:记录是在父节点的左孩子处找到的指定节点还是右孩子处找到的指定节点,在查询深度K时直接从另一侧查询。只有距离小于指定深度时才有递归查询的必要,超出深度直接返回。import java.util.ArrayList;import java.

2021-07-29 16:34:25 134

原创 LeetCode--671. 二叉树中第二小的节点

671. 二叉树中第二小的节点思路:广度优先搜索 + 剪枝因为非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。所以,1 每一个二叉树的根节点一定是最小值点2 当某一节点值与根节点值不相等,判断是不是第二小值,同时该节点子节点均无需入队。(子节点与子树均大于当前节点)3 当某一节点值与根节点值相等,子节点入队import java.util.LinkedList;import java.uti

2021-07-27 03:14:13 207

原创 LeetCode--1743. 从相邻元素对还原数组

##1743. 从相邻元素对还原数组思路:先找到数组首尾,找到首尾后顺着就可以排列出整个数组如何找到首尾?在原数对数组中只出现一次的就是首项或者尾项使用哈希表保存每一位所相邻的所有数字。import java.util.*;/** * 1743. 从相邻元素对还原数组 * */public class Solution1743 { public int[] restoreArray(int[][] adjacentPairs) { Map<Integer

2021-07-25 18:33:08 76

原创 LeetCode--1736. 替换隐藏数字得到的最晚时间

1736. 替换隐藏数字得到的最晚时间/** * 1736. 替换隐藏数字得到的最晚时间 * */public class Solution1736 { public String maximumTime(String time) { char[] arr = time.toCharArray(); if (arr[0] == '?') { if (arr[1] == '?' || arr[1] < '4') {

2021-07-24 02:19:58 85

原创 LeetCode--1893. 检查是否区域内所有整数都被覆盖

1893. 检查是否区域内所有整数都被覆盖思路:使用差分数组前缀和解决一维数组区间覆盖问题 public boolean isCovered(int[][] ranges, int left, int right) { // 差分数组 int[] differentialArray = new int[60]; for (int[] range : ranges) { differentialArray[range[0]]++

2021-07-24 02:06:34 69

原创 差分数组解析

差分数组1.定义:差分数组是用来表示数组中相邻两个元素的差值的一组数组对于已知有n个元素的离线数列d,我们可以建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1]。如图:B列的数组是原始数组,D列的数组是针对B的一个差分数组。2.前缀和的计算:如图:B为原始数组,D为差分数组,F为前缀和由图可知:F1 = D1F2 = D1 + D1 + D2F3 = D1 + D1 + D1 + D2

2021-07-24 01:59:33 282

原创 LeetCode --138. 复制带随机指针的链表

138. 复制带随机指针的链表链表结构如下图 (LeetCode题目给的图片)难点在与随机指针的处理,同时注意处理好null节点思路及算法:迭代 + 拆分三步初始队列第一步:拷贝每一个节点。将新拷贝出来的节点插入原始节点后面(此时不处理随记指针)第二部:根据原始节点随机指针的位置,定位拷贝节点随机指针的位置,拷贝节点的随机指针位置会在原始指针下一位(注意处理null)第三部,拆分两个链表将上面的图转化成代码:class Solution { public Node co

2021-07-22 10:31:45 68

原创 LeetCode -- 剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点简单题分别遍历链表,先遍历链表A,使用哈希表存储节点,再遍历链表B,查找公共节点import java.util.HashSet;import java.util.Set;/** * 剑指 Offer 52. 两个链表的第一个公共节点 * */public class SolutionJZ52 { public class ListNode { int val; ListNode next;

2021-07-21 02:25:17 138

原创 Git 随记 基本操作

Git 随记 基本操作基本操作:git init 初始化仓库git clone 拷贝一份远程仓库,也就是下载一个项目。git add 添加文件到仓库git status 查看仓库当前的状态,显示有变更的文件。git diff 比较文件的不同,即暂存区和工作区的差异。git commit 提交暂存区到本地仓库。git reset 回退版本。git rm 删除工作区文件。git mv 移动或重命名工作区文件。git log 查看历史提交记录git bla

2021-07-20 11:31:15 58

原创 LeetCode --1877. 数组中最大数对和的最小值

import java.util.Arrays;/** * 1877. 数组中最大数对和的最小值 * * 排序 + 贪心 * 朴素推论:如果保证一个数组中最大数对和的值最小,一定是让最大的和最小的,次大的和次小的。。。。。相加 */public class Solution1877 { public int minPairSum(int[] nums) { int length = nums.length; Arrays.sort(nums);

2021-07-20 10:05:43 106

原创 LeetCodce --1838. 最高频元素的频数

1838. 最高频元素的频数思路:排序 + 滑动窗口排序:按照从小到大对数组排序试图将第二个数字当做众数,补齐第一个数字。k减小2次。该题目就是使用最多K次,补齐一段最长的平台。使用双指针,保证双指针之间平台是平齐的。每次左指针移动,代表我们拿回来了当前指针指向位置所补齐需要消耗的K值,每次右指针移动,证明我们需要消耗K的次数来填平左右指针之间的差值。因为上一次计算中,我们先将左右指针间平台补齐,所以在右指针再次移动时,我们只需以右指针前一个位置作为基准点,计算左指针与该位置的差值再乘该基准

2021-07-19 10:21:59 174 2

原创 LeetCode -- 面试题 10.02. 变位词组

面试题 10.02. 变位词组思路:对每一个字符串按照指定顺序排序,排序后相同的字符串存放在同一个列表中import java.util.*;/** * 面试题 10.02. 变位词组 * */public class SolutionMS1002 { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> resList

2021-07-18 17:29:27 82

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除