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