力扣-剑指offer
文章平均质量分 53
nefu-ljw
这个作者很懒,什么都没留下…
展开
-
力扣 每日一题 1017. 负二进制转换【难度:中等,rating: 1697】(负二进制)
类似十进制转二进制%2,改成%(-2),可能的余数为0,1,-1。想办法把-1给转换掉:就是余数-1变成+1,然后商+1原创 2023-04-06 12:35:20 · 456 阅读 · 0 评论 -
力扣 每日一题 1326. 灌溉花园的最少水龙头数目【难度:困难,rating: 1885】(动态规划)
得到所有区间,按左端点L、右端点R进行排序。然后遍历这些区间覆盖的每个点i,保证L原创 2023-02-21 15:40:27 · 217 阅读 · 0 评论 -
力扣 每日一题 1250. 检查「好数组」【难度:困难,rating: 1983】(数论)
这题关键在于发现最大公因数(gcd)起到的作用,将原问题转换为“判断是否存在多个数,它们的gcd=1”。更形式化的定理称为“裴蜀定理”原创 2023-02-15 19:43:43 · 164 阅读 · 0 评论 -
力扣 每日一题 862. 和至少为 K 的最短子数组【难度:困难,rating: 2306】(前缀和+单调队列)
可以想办法维护放入队列的下标 i 对应的前缀和 sum[i] 依然单调递增。为了做到这一点,考虑在加入当前下标 i 到队列之前,弹出不影响后续答案的元素。结论:假设 sum[i] 的前面有一些 sum[j] (j < i),满足sum[j]>=sum[i],那么这些 j 被弹出并不会影响答案。原创 2022-10-27 20:49:34 · 425 阅读 · 0 评论 -
力扣 每日一题 934. 最短的桥【难度:中等,rating: 1825】(dfs / bfs)
题目要求的实际上是两个由1组成的连通块之间的最小距离。那么直接可以想到:把这两个连通块内的所有点分别求出来,然后O(n2)遍历这些点,求它们的最小距离即为答案。两次dfs(深度优先搜索)即可得到两个连通块内的所有点。原创 2022-10-25 12:25:11 · 307 阅读 · 0 评论 -
leetcode笔记(自用)
1024 程序员节快乐!原创 2022-10-24 20:57:36 · 1221 阅读 · 0 评论 -
力扣 每日一题 1235. 规划兼职工作【难度:困难,rating: 2022】(动态规划+二分查找)
将所有工作按结束时间排序,然后考虑动态规划:1. 直接放弃第 i 个工作,那么保持前 i-1 个工作的收益,dp[i]=dp[i-1]。2. 设法选上第 i 个工作,那么dp[i]=dp[k]+profit[i],其中 k 必须满足 end[k]原创 2022-10-22 12:14:12 · 561 阅读 · 2 评论 -
力扣 每日一题 902. 最大为 N 的数字组合【难度:困难,rating: 1989】(数学 / 数位dp)
设 n 的位数(长度)为 len_n,digits 的长度为 len_d,那么长度小于 len_n 的从 digits 中取出的所有任意组合均满足条件,方案数原创 2022-10-18 13:20:52 · 663 阅读 · 0 评论 -
力扣 每日一题 886. 可能的二分法【难度:中等,rating: 1794】(并查集 / 拆点优化的扩展域并查集)
文章目录题目链接思路一(建图+并查集)代码一思路二(扩展域并查集)代码二其他解法补充资料:并查集的时间复杂度原创 2022-10-17 19:59:05 · 544 阅读 · 0 评论 -
力扣 每日一题 768. 最多能完成排序的块 II【难度:困难,rating: 1787】(区间合并+区间计数)
只需合并小区间成大区间,然后统计大区间个数即可。原数组中的每个位置 start_pos,需要进行升序排序得到一个新位置 end_pos。这样能固定一个最小块的区间[min(start_pos,end_pos), max(start_pos,end_pos)],也就是说,至少在这个范围内的数必须划分在同一个块里面,这是必要条件,否则就不满足所有块连接起来之后升序。那么我们可以存储所有最小块的区间,它们之间可能有交集,对于有交集的,就把这些区间并在一起(小的块合并成大的块);原创 2022-10-13 17:36:35 · 191 阅读 · 0 评论 -
力扣 每日一题 801. 使序列递增的最小交换次数【难度:困难,rating: 2066】(动态规划)
对于每个位置 i,都有两种可能的操作(交换、不交换)。可以用一个数组记录每个位置 i,在 交换/不交换 操作后满足递增关系时的总操作次数。假设从位置 0 到位置 i 满足递增关系所需总操作次数为dp[i][0](位置 i 不交换),从位置 0 到位置 i 满足递增关系所需总操作次数为dp[i][1](位置 i 交换),考虑其前一个相邻位置 i-1,那么它们满足以下关系:原创 2022-10-10 20:29:03 · 426 阅读 · 0 评论 -
力扣 第314场周赛 Q3 使用机器人打印字典序最小的字符串【难度:中等,rating: 1953】(栈+贪心)
字符串 t 后进先出,可以看成是一个栈。贪心思想:遍历字符串 s,操作如下:若 当前栈顶原创 2022-10-10 00:04:31 · 224 阅读 · 0 评论 -
力扣 每日一题 856. 括号的分数【难度:中等,rating: 1562】(栈 / 思维计数&括号深度)
可以发现每次加上的值总是2的幂(幂次设为n,即2^n),那么不妨考虑幂次n与括号的关系:n=左括号的个数−右括号的个数左括号减去右括号的个数其实就是“括号的深度”。只在括号形式为"()"时进行计数,因为这是被包裹在最里面的成对括号,只要记录它的深度并且计数即可原创 2022-10-09 17:32:51 · 647 阅读 · 0 评论 -
力扣 每日一题 870. 优势洗牌【难度:中等,rating: 1648】(贪心+双指针)
贪心、双指针。贪心策略类似于田忌赛马(大的匹配大的,匹配不上就用小的匹配大的)。首先,肯定要把nums1, nums2排序,对于nums2还要额外记一下排序前的原坐标(可以用pair存到vector里面),存入s2。然后,以下图为例,用双指针i, j比较两个数组尾部的大小,逆序遍历s2,如果nums1>s2,那么直接匹配上;反之,则将s2匹配上nums1的首部,这个首部的坐标可以再加一个指针k来维护。原创 2022-10-08 11:54:59 · 261 阅读 · 0 评论 -
力扣 每日一题 927. 三等分【难度:困难,rating: 1994】(思维+后缀字符串+bitset技巧)
本题的关键在于发现:1.字符串能被三等分 => 1的总个数必须是3的倍数。必须满足这个必要条件。2.第3个子串的结束位置被固定在串的末尾,那么第3个子串的后缀0的个数suffix_zero_count,能用于限制前面第1、2个子串的后缀0个数。因为第3个子串的后缀0是固定的,而前面的两个子串的后缀0是可以往后调整的,只要它们的后缀0个数>=suffix_zero_count,多余的后缀0就可以划分给下一个子串作为前导0。通过这种调整,确定了第1、2个子串的结束位置,同时也确定了第2、3个子串的开始位置。原创 2022-10-06 21:06:12 · 638 阅读 · 1 评论 -
力扣 每日一题 811. 子域名访问计数【难度:中等,rating: 1377】(字符串切分+哈希表计数)
字符串切分,哈希表计数。原创 2022-10-06 17:07:07 · 248 阅读 · 0 评论 -
力扣 每日一题 777. 在LR字符串中交换相邻字符【难度:中等,rating: 1938】(思维)
题意的浅层描述是:start串的XL能被替换为LX,RX能被替换为XR。对于start串的替换操作,稍加扩展可以得到:L能够越过左边的若干个X,但是不能越过L或R。R能够越过右边的若干个X,但是不能越过L或R。例如 start=RXXLRXRXL -> RLXXXXRRL。原创 2022-10-03 11:20:49 · 302 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表【难度:简单】(链表翻转)
非常经典的单向链表翻转。思路就是固定原来的头结点init_head,把init_head后面的结点依次移动到链表首部,直到init_head后面没有结点,即init_head变成了链表尾部。原创 2022-09-30 16:08:22 · 192 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找【难度:中等】(类二叉查找树)
主要有三种思路:1.暴力找,时间复杂度O(n*m)。2.二分找,时间复杂度O(n*logm)。3.看成是二叉排序树的查找,时间复杂度O(n+m)。第三种思路比较巧妙,利用该矩阵的特殊性质(行元素递增、列元素递增),将矩阵看成是二叉排序树,每个元素是树中的一个结点,其左边的元素都比它小,下边的元素都比它大。 右上角的元素看成是根结点。注:二叉查找树 (BST,Binary Search Tree),又称二叉搜索树、二叉排序树。原创 2022-09-30 00:05:40 · 575 阅读 · 0 评论