随笔分类 -  算法

摘要:#使用场景 多次修改某个数(单点),求区间和:「树状数组」 #定义 #模板 // 上来先把三个方法写出来 { int[] tree; //求最低位的1 的二进制表示 int lowbit(int x) { return x & -x; } // 查询前缀和的方法 int query(int x) { 阅读全文
posted @ 2022-04-04 13:03 刚刚好。 阅读(42) 评论(0) 推荐(0) 编辑
摘要:#滚动哈希 我们判断两个字符串是否相同,往往是通过比较两个字符串的哈希。 常用语言中计算字符串哈希的方法往往是一个字符一个字符的计算,导致计算字符串哈希的时间复杂度是O(C),其中C是字符串的长度。 如果我们要计算字符串长度为C的子串的哈希,时间复杂度为O(NC)。 我们可以利用前缀的思想,采用滚动 阅读全文
posted @ 2021-12-23 15:07 刚刚好。 阅读(309) 评论(0) 推荐(0) 编辑
摘要:当题目出现「找到最近一个比其大(小)的元素」的字眼时,自然会想到「单调栈」。 具体的,由于我们目标是找到某个数其在 nums2 的右边中第一个比其大的数,因此我们可以对 nums2进行逆序遍历。 我们在遍历 nums2 时,实时维护一个单调栈,当我们遍历到元素 nums2[i] 时,可以先将栈顶中比 阅读全文
posted @ 2021-10-26 13:31 刚刚好。 阅读(3) 评论(0) 推荐(0) 编辑
摘要:模拟退火算法是求解最优化问题的一种手段。 一种随机算法,相当于爬山,我们总是往高处爬,即使下一步的位置低于现在的位置,考虑到局部最优解的存在,我们也以一定概率接受它。 step1:先设定好初始温度t0=最高温度tMax, 随机选定一个初始状态i,计算f(i); step2:若在当前温度下达到内层循环 阅读全文
posted @ 2021-10-07 21:35 刚刚好。 阅读(162) 评论(0) 推荐(0) 编辑
摘要:#三数之和 ##题目 ##分析 ###第一种 三数之和我们的思路是先排序,然后枚举第一个数,然后用双指针去找另外两个数 考虑此时和为-3<0,在我们固定住第一个数(绿色指针)的情况下,可以增大第二个数(蓝色指针),如果三数之和大于0,那么我们就缩小第三个数(橙色)。 需要注意的是我们如何排除重复的组 阅读全文
posted @ 2021-10-05 17:05 刚刚好。 阅读(363) 评论(2) 推荐(0) 编辑
摘要:https://www.jianshu.com/p/116aa58b7d81 阅读全文
posted @ 2021-10-02 14:23 刚刚好。 阅读(17) 评论(0) 推荐(0) 编辑
摘要:#题目 #解法 public class Solution { public ListNode detectCycle(ListNode head) { if(head==null) return null; ListNode fast=head; ListNode slow=head; //判断有 阅读全文
posted @ 2021-10-01 23:03 刚刚好。 阅读(54) 评论(0) 推荐(0) 编辑
摘要:对于「表达式计算」这一类问题,你都可以使用这套思路进行解决。我十分建议你加强理解这套处理逻辑。 对于「任何表达式」而言,我们都使用两个栈 nums 和 ops: nums : 存放所有的数字 ops :存放所有的数字以外的操作 然后从前往后做,对遍历到的字符做分情况讨论: 空格 : 跳过 ( : 直 阅读全文
posted @ 2021-09-15 10:43 刚刚好。 阅读(101) 评论(0) 推荐(0) 编辑
摘要:LRU算法是内存换出算法,只不过实现代价比较大,我们可以使用Clock算法。 public class LRUCache { class DLinkedNode { int key; int value; DLinkedNode prev; DLinkedNode next; public DLin 阅读全文
posted @ 2021-09-12 20:14 刚刚好。 阅读(140) 评论(0) 推荐(0) 编辑
摘要://这道题关键在于如何判断两个分数相等,这里采用除以gcd化为最简,然后构造成字符串。 class Solution { public long interchangeableRectangles(int[][] rectangles) { long res=0; HashMap<String,In 阅读全文
posted @ 2021-09-12 14:36 刚刚好。 阅读(224) 评论(0) 推荐(0) 编辑
摘要://其实整个算法的思路就是把 所有数据分为一半大的,一半小的,放在两个堆中 //我们每次取中位数,只需要关心堆顶元素即可 class MedianFinder { PriorityQueue<Integer> queMin; PriorityQueue<Integer> queMax; public 阅读全文
posted @ 2021-08-27 11:08 刚刚好。 阅读(41) 评论(0) 推荐(0) 编辑
摘要:#1.K 站中转内最便宜的航班 如果不考虑“最多经过K站”这个条件,这就是一道求最短路问题。 但是现在有了条件,就是有限制的最短路问题。我们考虑用dp来做。 可以看到当前状态,只与之前状态的 经过多少站,在哪一站 有关,因此是个二维dp class Solution { public int fin 阅读全文
posted @ 2021-08-24 16:07 刚刚好。 阅读(162) 评论(0) 推荐(0) 编辑
摘要:##什么是状压DP: 动态规划的状态有时候比较恶心,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。 典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不 阅读全文
posted @ 2021-08-16 15:17 刚刚好。 阅读(68) 评论(0) 推荐(0) 编辑
摘要:#差分数组 本文给大家介绍一个小而美的算法技巧:差分数组。 读完本文,你可以去解决力扣第 1109 题「航班预订统计」,难度 Medium 差分数组技巧是前文 前缀和技巧详解 写过的前缀和技巧的兄弟。 前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。 没看过前文没关系,这 阅读全文
posted @ 2021-07-17 18:25 刚刚好。 阅读(122) 评论(0) 推荐(0) 编辑
摘要:##背包问题本质 背包问题是「动态规划」中十分经典的一类问题,背包问题本质上属于组合优化的「 完全问题」。 如果你不了解什么是「 完全问题」,没有关系,丝毫不影响你求解背包问题。 你可以将「 完全问题」简单理解为「无法直接求解」的问题。 例如「分解质因数」问题,我们无法像四则运算(加减乘除)那样,按 阅读全文
posted @ 2021-06-17 16:46 刚刚好。 阅读(173) 评论(0) 推荐(0) 编辑
摘要:区间dp是dp的一种,指的是求一段区间上的最优解,其状态由小区间转换而来,dp的思路就是 先枚举 区间长度 再枚举 区间左端点 例题 //若是回文字符串,则首和尾相等,且去掉首尾后仍是回文字符串 class Solution { public String longestPalindrome(Str 阅读全文
posted @ 2021-06-16 14:35 刚刚好。 阅读(53) 评论(0) 推荐(0) 编辑
摘要:模板 左加右不加 long l = 0, r = 1000009; //注意是<不带等于号 while (l < r) { long mid = l + r + 1 >> 1; //如果是l=mid的话,需要加1,加1是防止死循环 if (check(mid)) { l = mid; //这里l可以 阅读全文
posted @ 2021-06-13 15:04 刚刚好。 阅读(674) 评论(0) 推荐(0) 编辑
摘要:在做位运算相关算法题时,经常需要我们提取二进制最右边的一位1,接下来我们就讲讲关于二进制最右边一位1的操作 ##获取二进制中最右边的1 也叫lowbit算法 x&(-x) 就是这么简洁,就能实现获取到二进制中最右边的 1,且其它位设置为 0。 原因: 首先在补码表示法中,负数的补码 = 取反 +1, 阅读全文
posted @ 2021-05-30 12:32 刚刚好。 阅读(1521) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示