![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 71
pospre
这个作者很懒,什么都没留下…
展开
-
【双指针】LeetCode- 905. 按奇偶排序数组
905. 按奇偶排序数组双指针 + 两遍扫描思路第一遍,处理偶数第二遍,处理奇数class Solution { public int[] sortArrayByParity(int[] nums) { int n = nums.length; int[] res = new int[n]; int slow = 0; for (int fast = 0; fast < n; fast++) {原创 2022-04-28 16:20:21 · 607 阅读 · 0 评论 -
DFS -LeetCode-563. 二叉树的坡度
563. 二叉树的坡度DFS/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, Tr原创 2022-04-27 14:30:13 · 762 阅读 · 0 评论 -
【两次遍历 OR 双指针】-LeetCode-821. 字符的最短距离
821. 字符的最短距离一次遍历 + 双指针思路从当前位置 iii 同时向左、右扫描,直至二者其中之一遇到 c(注意,防止边界 left、right 越界);取二者距离的 minclass Solution { public int[] shortestToChar(String s, char c) { int n = s.length(); int[] res = new int[n]; for (int i = 0; i <原创 2022-04-19 11:12:15 · 94 阅读 · 0 评论 -
【DFS专题】-LeetCode-22. 括号生成
22. 括号生成DFS参考:liweiwei1419 大佬的题解思路 🤔当前左括号没用完时,即 left < n,则可以继续添加左括号(对应上图中生成左子树);当前右括号没用完,且已经存在添加的右括号数量比 已经天的左括号数量少(严格小于)时,即right < n && right < left,才可以添加右括号(对应上图生成右子树)当所有括号(左、右括号)都用完了,即 right >= n && left >= n,则使用原创 2022-04-11 11:26:25 · 273 阅读 · 0 评论 -
【DFS专题】-LeetCode-993. 二叉树的堂兄弟节点
993. 二叉树的堂兄弟节点提示:二叉树的节点数介于 2 到 100 之间。每个节点的值都是唯一的、范围为 1 到 100 的整数。DFS思路 🤔题意转换:其实是让我们判断 xxx、yyy 节点的深度是否相等,且判断 xxx、yyy 的父节点是不是同一个节点使用 boolean dfs(TreeNode root, int target, int deepth) 来求:求节点值为 targettargettarget 节点的深度(自上而下)、及其父节点 ;若当前节点 root原创 2022-04-11 11:10:37 · 137 阅读 · 0 评论 -
位运算 -LeetCode-397. 整数替换
397. 整数替换提示:1<=n<=231−11 <= n <= 2^{31} - 11<=n<=231−1DFS(暴力)思路:根据题意,模拟nnn 为偶数,则减半,且操作次数加一;否则,找 n−1n - 1n−1 和 n+1n + 1n+1 变成 1 的操作次数的最小值class Solution { public int integerReplacement(int n) { return dfs(n);原创 2022-04-10 13:46:07 · 480 阅读 · 0 评论 -
【二分--分堆】 -LeetCode-1011. 在 D 天内送达包裹的能力
1011. 在 D 天内送达包裹的能力提示:1<=days<=weights.length<=5∗1041 <= days <= weights.length <= 5 * 10^41<=days<=weights.length<=5∗1041<=weights[i]<=5001 <= weights[i] <= 5001<=weights[i]<=500一开始误以为是“背包问题”,后来看了 三叶姐原创 2022-04-08 14:34:06 · 289 阅读 · 0 评论 -
【二分--分堆】-LeetCode-2226. 每个小孩最多能分到多少糖果
2226. 每个小孩最多能分到多少糖果提示:1<=candies.length<=1051 <= candies.length <= 10^51<=candies.length<=1051<=candies[i]<=1071 <= candies[i] <= 10^71<=candies[i]<=1071<=k<=10121 <= k <= 10^121<=k<=1012上周周赛的一原创 2022-04-05 20:16:26 · 360 阅读 · 0 评论 -
【二分专题】-「“两段性”」-LeetCode-33. 搜索旋转排序数组
33. 搜索旋转排序数组引言by 三叶题解在有序数组中搜索,可以考虑使用 【二分】求解。「二分」的本质是两段性,并非单调性。只要一段满足某个性质,另外一段不满足某个性质,就可以用「二分」。本题由于发生了“旋转”,整体上并不是纯粹的“有序数组”,所以首先需要找到“旋转点”的位置,而由于“旋转点”分割的左、右子数组 则均为“有序” --> 可以二分。查找“旋转点”的位置又可以有两种方法,即“线性遍历”、或“利用两段性”使用二分来找“旋转点”,具体的两种解法如下所示。二分(线性遍历旋转原创 2022-04-05 12:44:42 · 554 阅读 · 0 评论 -
区间求和 之`树状数组` -leetcode-307. 区域和检索 - 数组可修改
307. 区域和检索 - 数组可修改引言树状数组适用于什么场景?答:单点修改、区间查询lowbit 运算lowbit() 运算:非负整数 nnn在二进制表示下 最低位 1 及其后面的 0 构成的数值代码如下int lowbit(int x) { return x & -x;}树状数组概念对于一个序列,我们在其上建立一个如下如所示的森林结构。每个节点 t[x] 保存以 xxx (包括xxx)为根的子树中叶节点值的和。那么每个节点覆盖的长度是多少呢?把每原创 2022-04-04 11:38:16 · 1117 阅读 · 0 评论 -
矩阵-模拟
566. 重塑矩阵思路:首先,判断重塑尺寸是否合法,若不合法 --> 则直接返回原数组;维护一个下标 index 记录当前填充到“新数组”的第 index 个元素了;遍历“旧数组”,且新、老数组下标关系为:row = index / c;col = index % c;class Solution { public int[][] matrixReshape(int[][] mat, int r, int c) { if (mat.length ==原创 2022-04-03 21:11:59 · 501 阅读 · 0 评论 -
大、小堆 - 模拟 -leetcode-1801. 积压订单中的订单总数
1801. 积压订单中的订单总数大、小堆 - 模拟写的有点小复杂,大佬勿喷。只是记录一下自己的做题思路。思路:使用“小根堆 --> sellQueue 积压队列”、“大根堆 --> buyQueue 积压队列”;“采购”订单:“没人卖”、或“因为本次采购手里钱不够,而买不起”时,则直接将当前采购订单积压到 buyQueue,即可;本次采购能买得起时,则持续“采购”,直至(对应 while )“钱不足”、或“本次订单需求完事儿了” 、或 “已经没有商品可以采购了”;原创 2022-04-02 20:57:03 · 498 阅读 · 0 评论 -
【堆-模拟】SJF 短作业优先 -leetcode-1834. 单线程 CPU
1834. 单线程 CPU提示:tasks.length==ntasks.length == ntasks.length==n1<=n<=1051 <= n <= 10^51<=n<=1051<=enqueueTimei,processingTimei<=1091 <= enqueueTime_i, processingTime_i <= 10^91<=enqueueTimei,processingTimei<=109原创 2022-04-01 11:17:54 · 341 阅读 · 0 评论 -
单调栈-leetcode-739. 每日温度
739. 每日温度题目描述暴力class Solution { public int[] dailyTemperatures(int[] temperatures) { int n = temperatures.length; int[] res = new int[n]; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) {原创 2022-03-28 16:08:08 · 1000 阅读 · 0 评论 -
栈模拟 or 双指针 -leetcode-5236. 美化数组的最少删除数
5236. 美化数组的最少删除数今天周赛的题目栈-模拟思路:栈中元素个数为偶数,相当于下标奇数位置,此时下一个元素可以任意;栈中元素个数为奇数,相当于下标偶数位置,下一个元素不能和栈顶元素相同;最终栈中元素即为新数组,若栈中元素个数为奇数,还要额外去掉一个元素(题目要求美丽数组长度为偶数)class Solution { public int minDeletion(int[] nums) { int n = nums.length; Dequ原创 2022-03-27 13:10:11 · 626 阅读 · 0 评论 -
贪心 -leetcode-56. 合并区间
56. 合并区间题目描述以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i]=[starti,endi]intervals[i] = [start_i, end_i]intervals[i]=[starti,endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。贪心 + 模拟思路:先按照起始位置升序排序; (为了让区间更“紧凑”)将升序排序后的第一个区间 放入结果集 res;遍历 interna原创 2022-03-18 11:15:13 · 396 阅读 · 0 评论 -
贪心 -leetcode-1005. K 次取反后最大化的数组和
1005. K 次取反后最大化的数组和题目描述给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i]nums[i]nums[i] 替换为 −nums[i]-nums[i]−nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下标 i 。以这种方式修改数组后,返回数组 可能的最大和 。提示:1<=nums.length<=1041 <= nums.length <= 10^41<=nums.le原创 2022-03-16 20:04:29 · 271 阅读 · 0 评论 -
leetcode-235. 二叉搜索树的最近公共祖先
235. 二叉搜索树的最近公共祖先题目描述dfs(适用于所有二叉树)思路:采用后序遍历(从下向上遍历)若当前节点左子树中含p、右子树中含q(或反之),则说明当前 rootrootroot 即为 p、q的最近公共祖先;若当前节点左子树为空,则说明结果可能在当前节点的右子树中,则返回 右子树的遍历结果;若当前节点左有子树为空,则说明结果可能在当前节点的左子树中,则返回 左子树的遍历结果;否则,返回 null这里采用后序遍历,并且需要根据左、右子树的返回结果进行下一步逻辑判断,所以这里原创 2022-03-13 12:52:07 · 377 阅读 · 0 评论 -
模拟 -leetcode-2016. 增量元素之间的最大差值
2016. 增量元素之间的最大差值题目描述暴力 (2层for)一种十分简单的方法就是暴力,并且题目数据范围也不大,可以两层 for 暴力求解class Solution { public int maximumDifference(int[] nums) { int res = -1; for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < num原创 2022-02-27 10:11:44 · 544 阅读 · 0 评论 -
冒泡排序 思想 -leetcode-969. 煎饼排序
969. 煎饼排序题目描述冒泡排序 思想参考:彤哥 题解思路:类似于冒泡排序思想:每次排序时,将当前最大的元素扔到当前的末尾,即保证 [k,n−1][k, n - 1][k,n−1] 是当前最大值当前的最大元素至多经过两次“煎饼交换”,就可以放到最终的位置将当前最大元素交换到开头(i = 0)处;再将这个元素从开头交换到 末尾class Solution { public List<Integer> pancakeSort(int[] arr) {原创 2022-02-19 23:56:31 · 135 阅读 · 0 评论 -
二分-leetcode-540. 有序数组中的单一元素
540. 有序数组中的单一元素题目描述给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。提示:1<=nums.length<=1051 <= nums.length <= 10^51<=nums.length<=1050<=nums[i]<=1050 <= nums[i] <= 10原创 2022-02-14 23:08:39 · 192 阅读 · 0 评论 -
滑动窗口 -leetcode-1984. 学生分数的最小差值
1984. 学生分数的最小差值题目描述提示:1<=k<=nums.length<=10001 <= k <= nums.length <= 10001<=k<=nums.length<=10000<=nums[i]<=1050 <= nums[i] <= 10^50<=nums[i]<=105滑动窗口必然是排序后,相邻 k 个数的 首尾 之间取 min思路:先排序;若数组长度小于 k,则原创 2022-02-11 23:36:55 · 313 阅读 · 0 评论 -
哈希表 -leetcode-2006. 差的绝对值为 K 的数对数目
2006. 差的绝对值为 K 的数对数目提示:1<=nums.length<=2001 <= nums.length <= 2001<=nums.length<=2001<=nums[i]<=1001 <= nums[i] <= 1001<=nums[i]<=1001<=k<=991 <= k <= 991<=k<=99暴力数据范围比较小,可以直接 2层for暴力枚举这里省略代码原创 2022-02-09 23:39:05 · 291 阅读 · 0 评论 -
双指针 or 哈希表 -leetcode-1748. 唯一元素的和
1748. 唯一元素的和题目描述给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。请你返回 nums 中唯一元素的 和 。提示:1<=nums.length<=1001 <= nums.length <= 1001<=nums.length<=1001<=nums[i]<=1001 <= nums[i] <= 1001<=nums[i]<=100hash思路:数据范围比较小,可以直原创 2022-02-06 17:03:03 · 190 阅读 · 0 评论 -
DFS -leetcode-1219. 黄金矿工
1219. 黄金矿工题目描述你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。为了使收益最大化,矿工需要按以下规则来开采黄金:每当矿工进入一个单元,就会收集该单元格中的所有黄金。矿工每次可以从当前位置向上下左右四个方向走。每个单元格只能被开采(进入)一次。不得开采(进入)黄金数目为 0 的单元格。矿工可以从网格中 任意一个 有黄金的单元格出发原创 2022-02-05 22:44:59 · 170 阅读 · 0 评论 -
贪心 -leetcode-1414. 和为 K 的最少斐波那契数字数目
1414. 和为 K 的最少斐波那契数字数目题目描述提示:1<=k<=1091 <= k <= 10^91<=k<=109贪心思路:????先枚举出 [1, k] 内所有的斐波那契数;然后,找到“最接近 k的斐波那契数”(即,下标为 fabo.size() - 1对应的数,下标记作 index);从 index开始,从后向前 贪心枚举每个数:如果当前斐波那契数 cnt > k,则需要将 index 向前移动,直至 cnt <= k;原创 2022-02-03 23:57:49 · 415 阅读 · 0 评论 -
排序+贪心 -leetcode-1996. 游戏中弱角色的数量
1996. 游戏中弱角色的数量题目描述你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击 和 防御 。给你一个二维整数数组 properties ,其中 properties[i] = [attacki, defensei] 表示游戏中第 i 个角色的属性。如果存在一个其他角色的攻击和防御等级 都严格高于 该角色的攻击和防御等级,则认为该角色为 弱角色 。更正式地,如果认为角色 i 弱于 存在的另一个角色 j ,那么 attackj > attacki 且 defensej > d原创 2022-01-28 23:40:55 · 2396 阅读 · 0 评论 -
双指针 -leetcode-1332. 删除回文子序列
1332. 删除回文子序列题目描述给你一个字符串 s,它仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。返回删除给定字符串中所有字符(字符串为空)的最小删除次数。「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文提示:1<=s.length<=10001 <= s.length &原创 2022-01-22 16:47:26 · 202 阅读 · 0 评论 -
哈希表 -leetcode-219. 存在重复元素II
219. 存在重复元素 II题目描述给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。提示:1<=nums.length<=1051 <= nums.length <= 10^51<=nums.length<=105109<=nums[i]<=10910^9原创 2022-01-19 12:14:53 · 666 阅读 · 0 评论 -
模拟 -leetcode-1716. 计算力扣银行的钱
原创 2022-01-15 21:51:39 · 168 阅读 · 0 评论 -
优先队列 -leetcode-373. 查找和最小的 K 对数字
373. 查找和最小的 K 对数字题目描述给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。优先队列题目数据范围过大 10510^5105,暴力算法算出两两结果,会 tle思路:彤哥题解使用堆保存 [index1, index2],即当前最小数对为:{nums1[ind原创 2022-01-14 23:44:50 · 157 阅读 · 0 评论 -
位运算 -leetcode -231. 2 的幂
231. 2 的幂题目描述给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。提示:−231<=n<=231−1-2^{31} <= n <= 2^{31} - 1−231<=n<=231−1暴力思路:依次枚举,直至 cnt>=ncnt >= ncnt>=n注意:使用 long 防止 cntc原创 2021-12-29 21:45:16 · 201 阅读 · 0 评论 -
图 -leetcode-997. 找到小镇的法官
997. 找到小镇的法官题目描述在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。如果小镇的法官真的存在,那么:小镇的法官不相信任何人。每个人(除了小镇法官外)都信任小镇的法官。只有一个人同时满足条件 1 和条件 2 。给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。提示:1<=原创 2021-12-19 11:30:51 · 73 阅读 · 0 评论 -
小根堆+贪心 -leetcode-1005. K 次取反后最大化的数组和
1005. K 次取反后最大化的数组和题目描述给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下标 i 。以这种方式修改数组后,返回数组 可能的最大和 。小根堆+贪心思路:每次都是从 nums 中取 min 值,并反转将反转后的 min 再次插入 小根堆中class Solution { public int largestSumAfterK原创 2021-12-03 09:47:27 · 177 阅读 · 0 评论 -
双指针 -leetcode-1446. 连续字符
1446. 连续字符题目描述给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串的能量。提示:1<=s.length<=5001 <= s.length <= 5001<=s.length<=500s 只包含小写英文字母。其实,题目就是让求 最长连续相同子串长度思路:双指针:i 表示 连续相同子串的 起始位置,j 表示 连续相同子串的终止位置;初始化:i = 0; j = 1;若 s[i原创 2021-12-01 19:33:10 · 286 阅读 · 0 评论 -
脑筋急转弯&滑动窗口-leetcode-594. 最长和谐子序列
594. 最长和谐子序列题目描述和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。哈希一开始有点被绕进去了,后来发现就是 求 nums 升序后 相邻元素的个数总和的最大值,即可。思路1:(哈希)使用 map 统计每个元素出现次数;遍历 map,查看 key + 1 是否在原创 2021-11-21 10:18:35 · 84 阅读 · 0 评论 -
双指针-leetcode-160. 相交链表
160. 相交链表题目描述哈希将 headAheadAheadA 中所有节点放入 set 中;然后,检查 headBheadBheadB 中节点是否出现在 headAheadAheadA 中:若出现,则说明 当前节点为“交点”;若 headBheadBheadB 中所有节点均未在 set 中出现,说明 “无交点”/** * Definition for singly-linked list. * public class ListNode { * int val原创 2021-11-08 12:45:17 · 233 阅读 · 0 评论 -
单调栈-leetcode-739. 每日温度
739. 每日温度题目描述请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。提示:1<=temperatures.length<=1051 <= temperatures.length <= 10^51<=temperatures.length<=10530<=temperatures[i]<=10030 <= temperatures[i]原创 2021-11-06 22:48:11 · 172 阅读 · 0 评论 -
leetcode-268. 丢失的数字
268. 丢失的数字题目描述给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。哈希表使用一个长度为 n+1n+1n+1 的数组,标记 [0,n][0, n][0,n] 中每个数字是否出现。class Solution { public int missingNumber(int[] nums) { int n = nums.length; int[] arr = new int[n +原创 2021-11-06 18:35:04 · 162 阅读 · 0 评论 -
dp 子序列问题-leetcode-1218. 最长定差子序列
1218. 最长定差子序列题目描述给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。提示:1<=arr.length<=1051 <= arr.length <= 10^51<=arr.length<=105−104<=arr[i],原创 2021-11-05 17:12:14 · 169 阅读 · 0 评论