
算法
文章平均质量分 50
lsz冲呀
奋斗者
展开
-
两个数组有序A,B,如何去找到数组A,B中两个相同的元素?
两个有序数组找重复元素原创 2022-09-12 22:24:55 · 1129 阅读 · 3 评论 -
KMP 算法Next数组
KMP算法Next数组原创 2022-09-12 16:50:46 · 1776 阅读 · 0 评论 -
用友7.25笔试 算法复盘
7.25 用友算法复盘原创 2022-07-25 22:08:04 · 256 阅读 · 1 评论 -
leetcode 448. 找到所有数组中消失的数字
leetcode 448. 找到所有数组中消失的数字原创 2022-07-22 16:58:28 · 249 阅读 · 0 评论 -
Is It A Tree?
Is It A Tree原创 2022-07-17 23:06:39 · 178 阅读 · 0 评论 -
leetcode 128.最长连续序列
Leetcode 128. 最长连续序列原创 2022-07-17 22:43:33 · 95 阅读 · 0 评论 -
字符串旋转
算法:字符串反转原创 2022-07-17 22:35:41 · 187 阅读 · 0 评论 -
LeetCode 301场周赛 6114. 移动片段得到字符串
LeetCode 301场周赛原创 2022-07-10 22:24:34 · 231 阅读 · 0 评论 -
Leetcode 301场周赛 6113. 无限集中的最小数字
LeetCode 301场周赛原创 2022-07-10 21:10:46 · 117 阅读 · 0 评论 -
leetcode 301场周赛 6112 装满杯子需要的最短总时长
leetcode 301场周赛原创 2022-07-10 21:06:23 · 225 阅读 · 0 评论 -
leetcode 课程表II
拓扑排序原创 2022-07-09 11:12:58 · 210 阅读 · 0 评论 -
leeetcode 205. 同构字符串
双射,字符串转换原创 2022-06-30 23:01:04 · 130 阅读 · 0 评论 -
LeetCode1153 字符串转化
字符串转化原创 2022-06-30 21:50:39 · 788 阅读 · 0 评论 -
leetcode 递增子序列
题目给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]示例 2:输入:nums = [4,4,3,2,1]输出:[[4,4]]提示:1 <= nums原创 2022-05-23 17:32:48 · 268 阅读 · 0 评论 -
欧拉回路 Hierholzer算法
导读今天在刷leetcode时,遇到了欧拉回路的问题,之前没遇到过,这里做个笔记。欧拉回路与欧拉通路欧拉回路: 遍历所有边一次且行遍所有顶点的回路欧拉通路: 遍历所有边一次且行遍所有顶点的通路欧拉图: 具有欧拉回路的图半欧拉图: 具有欧拉通路的图判定条件欧拉图: 每个点度数都为偶数,相当于很多个环交叉起来。半欧拉图: 仅有两个点度数为偶数,相当于一条边连着两个欧拉图。Hierholzer算法Hierholzer 算法用于在连通图中寻找欧拉路径,其流程如下:从起点出发,进行深度优先原创 2022-05-23 16:04:56 · 501 阅读 · 0 评论 -
leetcode 存在重复元素 III
问题给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。示例 1:输入:nums = [1,2,3,1], k = 3, t = 0输出:true示例 2:输入:nums = [1,0,1,1], k = 1, t = 2输出:true示例 3:输入:nums = [1原创 2022-05-19 22:24:30 · 319 阅读 · 0 评论 -
leetcode 单调栈
下一个更大元素 I题目nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的原创 2022-05-17 10:22:45 · 95 阅读 · 0 评论 -
NC 113 验证IP地址
题目编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个原创 2022-05-13 14:03:22 · 161 阅读 · 0 评论 -
二分查找案例分析
导读二分查找作为程序员的一项基本技能,是面试官最常使用来考察程序员基本素质的算法之一,也是解决很多查找类题目的常用方法,它可以达到O(log n)的时间复杂度。一般而言,当一个题目出现以下特性时,你就应该立即联想到它可能需要使用二分查找:待查找的数组有序或者部分有序要求时间复杂度低于O(n),或者直接要求时间复杂度为O(log n)二分查找有很多种变体,使用时需要注意查找条件,判断条件和左右边界的更新方式,三者配合不好就很容易出现死循环或者遗漏区域,本篇中我们将介绍常见的几种查找方式的模板代码转载 2022-05-07 14:49:55 · 820 阅读 · 0 评论 -
leetcode 回文子串
题目给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:s = "aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa" 提示:1原创 2022-05-05 21:42:06 · 385 阅读 · 0 评论 -
leetcode加油站
题目在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。示例 1: 输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2] 输出: 3 解释: 从原创 2022-05-03 22:18:32 · 315 阅读 · 0 评论 -
leetcode 接雨水
题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。提示:n == height.length1 <= n <= 2 * 1040 <= height[i] <= 105解题思路初次看到这个题目,要明确接雨水是如何计算的。也就是找出下雨后水能达到的最高位置,可以看出其等于两边最大高度的较小值减去当前高度的值。不难想到可以对于每一个位置,找到左右的最高点。public int trap(int[] height)原创 2022-04-21 11:36:04 · 817 阅读 · 0 评论 -
leetcode 数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5限制:0 <= 数组长度 <= 50000解题思路直观来看,使用暴力统计法即可,即遍历数组的所有数字对并统计逆序对数量。此方法时间复杂度为 O(N^2) ,观察题目给定的数组长度范围 0 <= N ≤50000 ,可知此复杂度是不能接受的。其实这是一道典型的归并排序的应用。「归并排序」与「逆序对」是原创 2022-04-17 23:51:10 · 294 阅读 · 0 评论 -
leetcode 数组中数字出现的次数
题目一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2] 限制:2 <= nums.length <= 10000题目看到题目要求空间复杂度为O(1),那就不能使用HashMap的方式,只原创 2022-04-15 14:25:30 · 264 阅读 · 0 评论 -
leetcode 把数组排成最小的数
题目输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459" 提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0解题思路此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums原创 2022-04-10 22:59:36 · 279 阅读 · 0 评论 -
leetcode 寻找两个正序数组的中位数
题目给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n)) 。示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 =原创 2022-04-08 12:43:14 · 359 阅读 · 0 评论 -
leetcode 搜索插入位置
题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例 2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3,5,6], target = 7输出: 4解题思路从题目要求的时间复杂度,我们可以看出这一道二原创 2022-04-08 11:01:13 · 957 阅读 · 0 评论 -
leetcode 重排链表
题目给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[1,4,2,3]解题思路1首先我们可以想到,因为链表不支持下标访问,所以我们无法随机访问链表中任意位置的元素。因此,我们可以利用线性表存储该链表,然后利用线性原创 2022-04-07 19:03:29 · 595 阅读 · 0 评论 -
leetcode 数字序列中某一位的数字
题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。示例 1:输入:n = 3输出:3示例 2:输入:n = 11输出:0 限制:0 <= n < 2^31思路严格说没用到啥数据结构,就是纯数学的模拟与推导,具体分析步骤如下:将 101112⋯ 中的每一位称为 数位 ,记为 n ;将 10, 11,原创 2022-04-05 23:47:49 · 514 阅读 · 0 评论 -
leetcode 数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2 限制:1 <= 数组长度 <= 50000思路看到题目很容易想到以下两种方法:哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出众数 。此方法时间和空间复杂度均为 O(N) 。数组排序法: 将数组 nums 排序,数组中点的元原创 2022-03-30 18:00:33 · 909 阅读 · 0 评论 -
leetcode 复杂链表的复制
题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]思路首先明确,题目不是想让我们在原链表上改,是想让我们深拷贝,也就是复制出一摸一样的一份链表。同时由于随机指针的存在原创 2022-03-29 17:45:16 · 156 阅读 · 1 评论 -
leetcode 岛屿数量
题目给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1示例 2:输入:grid = [原创 2022-03-29 11:30:34 · 1110 阅读 · 0 评论 -
leetcode 字符串转换整数 (atoi)
题目请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,"12原创 2022-03-27 23:08:58 · 250 阅读 · 0 评论 -
leetcode颠倒二进制
题目颠倒给定的 32 位无符号整数的二进制位。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。 示例 1:输入:n = 000000101001010000011110100111原创 2022-03-26 17:42:54 · 84 阅读 · 0 评论 -
左移与右移
今天在刷题时,碰到了位运算,用到了逻辑的右移与算术左移,因此在这里记录下相关的知识点与用法。算术左移与逻辑左移算术左移和逻辑左移一样都是右边补0:比如 00101011算术左移一位:01010110逻辑左移一位:01010110对于二进制的数值来说左移n位等于原来的数值乘以2的n次方比如00011010十进制是26,左移两位后是01101000转成十进制是104恰好是26的4倍。注意:这种倍数关系只适用于左移后被舍弃的高位不含1的情况,否则会溢出。算术右移与逻辑右移辑右移原创 2022-03-26 17:11:31 · 359 阅读 · 0 评论 -
leetcode 括号生成
题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8思路可以看到这是求解可能的所有情况,可以想到用回溯,也就是深度优先遍历在加上剪枝操作,关键找到递归的入口与出口,针对本题,括号的数量是递归的出口,当括号数量达到上限时,可以原创 2022-03-25 00:25:16 · 104 阅读 · 0 评论 -
leetcode 顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <= matrix[i].length <=原创 2022-03-23 23:58:37 · 208 阅读 · 0 评论 -
剑指offer 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5/ \1 2给定的树 B: 4 /1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。思路:若树 B 是树 A 的子结构,则子结构的根节点可能为树 A 的任意一个节点。因此,判断树 B 是否是树 A 的子结构,需完成以下两步工作:1.先序遍历树 A 中的每..原创 2022-03-22 23:35:29 · 60 阅读 · 0 评论 -
leetcode 二叉树的最近公共祖先
二叉树的最近公共祖先题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路:首先要明确什么是最近公共祖先:设节点 root 为节点 p, q的某公共祖先,若其左子节点 root.left 和右子节点 root.right都不是 p,q 的公共祖先,则称 root 是 “最近的公共祖先” 。根据原创 2022-03-21 00:38:13 · 143 阅读 · 0 评论 -
leetcode最长回文子串
最长回文子串题目:给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”思路:动态规划:对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是“a”。根据这样原创 2022-03-15 00:12:46 · 153 阅读 · 0 评论