Leetcode
该专栏主要针对每日一题的题解与方法的积累
宁皇说java
大专文学专业在读,干过工地和外卖,觉得还是编程香,目前研究方向:分布式微服务,检索引擎,数据仓库
展开
-
LeetCode406. 根据身高重建队列
Leetcode原创 2022-09-15 11:39:33 · 448 阅读 · 1 评论 -
Leetcode670. 最大交换
LeetCode每日一题原创 2022-09-13 12:33:10 · 247 阅读 · 1 评论 -
leetcode667. 优美的排列 II(构造,脑筋急转弯)
脑筋急转弯原创 2022-09-08 15:01:27 · 229 阅读 · 0 评论 -
LeetCode646. 最长数对链—(贪心+排序)
贪心算法原创 2022-09-03 14:15:27 · 126 阅读 · 0 评论 -
leetcode279. 完全平方数(计数型动态规划)
计数型dp原创 2022-09-01 16:27:09 · 292 阅读 · 0 评论 -
leetcode236. 二叉树的最近公共祖先
二叉树,LeetCode,二叉树的最近公共祖先原创 2022-08-31 11:56:09 · 207 阅读 · 0 评论 -
LeetCode208. 实现 Trie (前缀树)
前缀树原创 2022-08-30 11:08:14 · 103 阅读 · 0 评论 -
LeetCode207. 课程表(拓扑排序)
拓扑排序原创 2022-08-29 19:54:22 · 243 阅读 · 0 评论 -
LeetCode169. 多数元素(摩尔投票法)
169. 多数元素原创 2022-08-28 20:23:06 · 157 阅读 · 0 评论 -
Leetcode.盛最多水的容器
盛水最多的容器原创 2022-07-17 08:02:06 · 140 阅读 · 0 评论 -
LeetCode-使结果不超过阈值的最小除数(区间二分)
使结果不超过阈值的最小除数原创 2022-07-17 08:00:55 · 96 阅读 · 0 评论 -
LeetCode-每个小孩最多能分到多少糖果
二分原创 2022-07-17 08:00:16 · 122 阅读 · 0 评论 -
第一个错误的版本(最左元素的二分)
. 第一个错误的版本(最左元素的二分)原创 2022-07-17 07:59:00 · 109 阅读 · 0 评论 -
leetcode-盛最多水的容器
思路一: 暴利双for超时思路二:双指针+贪心面积=较短垂直线的长度*线之间的距离记录最短长度和距离,长度和值都尽可能大先由贪心思想,来确定解题的初始值 双指针分别确定头与尾 ,这样就保证了一个长度最大的情况,当左右分别减少时,则贪心的找左右两垂线值的较小值中的较大值作为高度(贪心的思想,是需要逐步对每一种情况进行推理的)例如:● 贪心决策左移或右移的区别1.无论移动哪根,宽度都会变小, 若移动长的那根,若移动后的垂线高度比之前短的更短或是更长都是亏损的(因为高度由短的决定)2. 所.原创 2022-03-10 20:12:35 · 99 阅读 · 0 评论 -
leetcode-蜡烛之间的盘子(经典空换时)
https://leetcode-cn.com/problems/plates-between-candles/思路:(预处理+前缀和)本题的思路是找到区间中的被两个蜡烛围起的盘子最先的思路是: 先获取前缀和,最后计算的过程,遍历去寻找下标最近的蜡烛-------->> 超时前缀和的思想就是以空间换时间,下标最近的蜡烛可以通过记忆保存到数组的方式,获取最近的蜡烛前缀和的获取: 只需要迭代累加的方式,记录从起点到当前结点的 ‘*’ 的数量注意事项:● 前几个 p q 为初始值时原创 2022-03-09 09:12:51 · 190 阅读 · 0 评论 -
leetcode——新年快乐
思路:这里只需要注意空的二维数组为int[0][0]即可class Solution { public int[][] construct2DArray(int[] original, int m, int n) { int[][] ans=new int[m][n]; if( (m*n)!=original.length ){ return new int[0][0]; } int k=0; .原创 2022-01-01 19:12:40 · 378 阅读 · 0 评论 -
leetcode242. 有效的字母异位词
题目思路:由于题目只有小写字母,我们只需要将两个字符串排序,再比较是否相同即可,也可以存储两字符串中的字符至Hash表,比较hash表的大小和其中的内容class Solution { public boolean isAnagram(String s, String t) { if(s.length()!=t.length()){ return false; } char[] temp1=s.toCharArray()原创 2021-11-21 10:56:47 · 169 阅读 · 0 评论 -
leetcode190. 颠倒二进制位
思路:本题主要还是考察二进制的操作,我们来向,所谓的颠倒二进制位,相当于反转一个字符串,高位的bit数和低位的bit数做交换,而且题目描述了,最高位和最低位的距离位32位,我们就可以取出数中的每一位(右移),再将该位移动到正确的位置即可(左移)注 (n>>i)&1 的意思是取出第i位下的bit数字(可以推导一下)ans|(temp<<(31-i)) 其中的或运算相当于二进制的加法,将每次反转后的数累加起来public class Solution { /.原创 2021-11-21 10:51:26 · 355 阅读 · 0 评论 -
leetcode203. 移除链表元素
移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]思路:简单题,当前结点为val就移动head结点,并将temp结点重新指向head,不是.原创 2021-06-05 17:41:01 · 71 阅读 · 0 评论 -
力扣(leetcode)链表相交
相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Intersected at ‘8’解释:相交节点的值为 8 (注意,如果两个.原创 2021-06-04 11:16:07 · 130 阅读 · 0 评论 -
leetcod525. 连续数组
这个月的题都是hash优化525. 连续数组给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。示例 1:输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相同数量0和1的最长连续子数组。示例 2:输入: nums = [0,1,0]输出: 2说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。提示:1 <= nums.length <= 105nums[i] 不是原创 2021-06-03 10:14:17 · 183 阅读 · 0 评论 -
leetcode-342. 4的幂
342. 4的幂给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x示例 1:输入:n = 16输出:true示例 2:输入:n = 5输出:false示例 3:输入:n = 1输出:true思路:暴搜,超过时间限制,将x的范围降到log级别使用二分查找,或将n设为x的根号。这里给出位运算的两种解法。思路一:判断是4的幂,首先要满足2的幂即 n&a原创 2021-05-31 17:12:15 · 99 阅读 · 1 评论 -
leetcode304. 二维区域和检索 (二维前缀)
二维区域和检索题目首先引入二维前缀二维前缀的模板题目给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。示例:给定 matrix = [[3, 0, 1, 4, 2],[5, 6, 3, 2, 1],[1, 2, 0, 1, 5],[4, 1, 0, 1, 7],[原创 2021-05-29 19:13:33 · 147 阅读 · 0 评论 -
leetcode477. 汉明距离总和(位运算优化)
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。计算一个数组中,任意两个数之间汉明距离的总和。示例:输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.注意:1. 数组中元素的范围为从 0到原创 2021-05-28 18:42:23 · 136 阅读 · 4 评论 -
leetcode461. 汉明距离(位运算||双指针)
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。注意:0 ≤ x, y < 231.示例:输入: x = 1, y = 4输出: 2解释:1 (0 0 0 1)4 (0 1 0 0)↑ ↑上面的箭头指出了对应二进制位不同的位置。思路1:转化成字符串的比对,创建两个指针指向字符串尾部,以较小的字符串为结束条件,去比较,再比较较长字符串剩余部分如果出现1,则ans++class Soluti原创 2021-05-27 11:07:14 · 94 阅读 · 0 评论 -
leetcode-1738. 找出第 K 大的异或坐标值
找出第 K 大的异或坐标值给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。示例 1:输入:matrix = [[5,2],[1,6]], k = 1.原创 2021-05-19 19:45:21 · 79 阅读 · 0 评论 -
leetcode1442. 形成两个异或相等数组的三元组数目
形成两个异或相等数组的三元组数目给你一个整数数组 arr 。现需要从数组中取三个下标 i、j 和 k ,其中 (0 <= i < j <= k < arr.length) 。a 和 b 定义如下:a = arr[i] ^ arr[i + 1] ^ … ^ arr[j - 1]b = arr[j] ^ arr[j + 1] ^ … ^ arr[k]注意:^ 表示 按位异或 操作。请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。示例 1:输入.原创 2021-05-18 20:37:46 · 61 阅读 · 1 评论 -
leetcode_1734. 解码异或后的排列
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。示例 1:输入:encoded = [3,1]输出:[1,2,3]解释:如果 perm = [1,2,3原创 2021-05-11 19:40:12 · 78 阅读 · 1 评论 -
Daily practice—解码异或后的数组
难度:简单未知 整数数组 arr 由 n 个非负整数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。请解码返回原数组 arr 。可以证明答案存在并且是唯一的。来源:力扣(LeetCode)思路:状态模拟异或过程原创 2021-05-06 18:36:23 · 57 阅读 · 0 评论 -
验证二叉树的前序序列化(入度和出度)
验证二叉树的前序序列化题目描述思路分析解题优化准备贴上代码题目描述验证二叉树的前序序列化序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / \ 4 1 # 6/ \ / \ / \# # # # # #例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”原创 2021-03-12 20:37:20 · 845 阅读 · 0 评论 -
Leetcode338.比特位记数
比特位计数给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]思路:理解数递增时的位操作即可,数每翻2倍就进一位。,即(0,1)(2,3),(4,5,6,7)每个括号中的数位数相同,且逐一递增0 1 (表示0,1)10 11 //低位(从2开始)100 101 110 111 //进了一位(从4开始.原创 2021-03-03 21:28:33 · 59 阅读 · 1 评论 -
Leetcode697. 数组的度
Leetcode697. 数组的度题目描述及思路Map遍历操作maxmin双层算法题目描述及思路数组的度给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入:[1, 2, 2, 3, 1]输出:2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1,原创 2021-02-22 12:38:26 · 110 阅读 · 0 评论 -
Leetcode.995995. K 连续位的最小翻转次数
K 连续位的最小翻转次数(困难)在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。返回所需的 K 位翻转的最小次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。示例 1:输入:A = [0,1,0], K = 1输出:2解释:先翻转 A[0],然后翻转 A[2]。示例 2:输入:A = [1,1,0], K = 2输出:-1解释:无论我们怎样翻转大小为 2 的子数组,.原创 2021-02-18 22:26:52 · 85 阅读 · 0 评论 -
Leetcode.566 重塑矩阵
在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。示例 1:输入:nums =[[1,2],[3,4]]r = 1, c = 4输出:[[1,2,3,4]]解释:行遍历num原创 2021-02-17 14:56:34 · 59 阅读 · 0 评论 -
Leetcode1208. 尽可能使字符串相等
给你两个长度相同的字符串,s 和 t。将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。示例 1:输入:s原创 2021-02-10 14:34:33 · 122 阅读 · 1 评论 -
滑动数组应用Leetcode1423. Maximum Points You Can Obtain from Cards
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。你的点数就是你拿到手中的所有卡牌的点数之和。给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。示例 1:输入:cardPoints = [1,2,3,4,5,6,1], k = 3输出:12解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是原创 2021-02-09 22:32:43 · 70 阅读 · 0 评论 -
leetcode链表插入排序题解
leetcode对链表进行插入排序的题解插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。示例 1:输入: 4->2->1->3输出:原创 2020-11-20 19:04:52 · 113 阅读 · 0 评论 -
Leetcode分发饼干(贪心算法)
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例 1:输入: g = [1,2,3], s = [1,1]输出: 1解释:你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,原创 2020-12-25 22:13:00 · 212 阅读 · 0 评论 -
leetcode 135. 分发糖果(贪心算法)
leetcode135. 分发糖果老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。思路为首,算法题提取出核心信息能提高效率,理解核心信息为思路正确的关键。纠正前的错误思路:记录下标,相原创 2020-12-25 23:07:48 · 90 阅读 · 0 评论 -
数组的相对排序
数组的相对排序给你两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。示例:输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输出:[2,2,2,1,4,3,3,9,6,7,19]首先想到的还是暴力排序法唯一有技巧的算法原创 2020-11-15 16:20:11 · 721 阅读 · 0 评论