06 2020 档案
摘要:记忆化递归解法: //结果计数 int an = 0; /** * @Author Niuxy * @Date 2020/6/30 10:38 下午 * @Description 外部循环,以每个元素开头的子串 * 内部循环,以每个元素结尾的子串 * 就可以遍历到所有长度大于 1 的可能的子串 */
阅读全文
摘要:回溯算法: public final boolean exist(char[][] board, String word) { if (board == null || word == null || word.length() > board.length * board[0].length) {
阅读全文
摘要:暴力解法: public final boolean canPartition1(int[] nums) { //边界 if (nums == null || nums.length < 2) { return false; } //剪枝 int sum = 0; int max = 0; for
阅读全文
摘要:记忆化递归: int max = 0; public int lenLongestFibSubseq(int[] A) { int[][] cache = new int[A.length][A.length]; for (int i = 0; i < A.length - 1; i++) { fo
阅读全文
摘要:借助全局变量 max 存储全局最优解,遍历以所有节点为头结点的子树。 static final int LEFT = -1; static final int RIGHT = 1; int max = 0; public final int longestZigZag(TreeNode root)
阅读全文
摘要:解题分两步。第一步从后向前遍历,对于每个元素,寻找位于其后且大于该元素的最小值与其交换位置;第二步将交换位置元素的后续元素进行升序排列。 /** * @Author Niuxy * @Date 2020/6/27 12:04 上午 * @Description 从后开始,将更后面的且大于该元素的最小
阅读全文
摘要:双指针解法为两个指针,一个指向头元素,一个指向尾元素。两个指针逐步向中间靠拢并比较路过的元素: /** * @Author Niuxy * @Date 2020/6/23 8:22 下午 * @Description 双指针 */ public final boolean isPalindrome(
阅读全文
摘要:只需要遍历一次,一旦遇到不相等的字符,比较剩余字符即可。 public static boolean oneEditAway(String first, String second) { int firstLen=first.length(); int secondLen=second.length
阅读全文
摘要:首先一个错误的暴力解法,加深对解空间结构的认识: /** * @Author Niuxy * @Date 2020/6/21 11:30 上午 * @Description 解决问题时先推导一下,问题是否可以被自己解决。 * 若果不行,尝试转化问题。 * 比如找出所有递增序列,并按长度计数 */ p
阅读全文
摘要:关键在于如何定义问题进行分治: 1. 问题的定义必须可以覆盖解空间。 2. 问题的解可由子问题的解表示,也就是状态转移关系。 划分问题,无非就是:按区间划分,找出区间与区间的关系,最后的问题覆盖整个问题入参区间;按点划分,找出点与点的关系,最后合并所有点的结果覆盖整个问题入参区间。 对于解题来说,无
阅读全文
摘要:public final int findLongestChain(int[][] pairs) { sort(pairs); int[] dp=new int[pairs.length]; dp[0]=1; int maxRe=0; for(int i=1;i<dp.length;i++){ in
阅读全文
摘要:暴力法没有什么技术含量,但暴力法包含着我们对解空间最基本但认识。不管什么题目,还是习惯最先用暴力的思路考虑一遍,再去考虑优化方式。 //最终结果 int an = 0; //路径计数 int tar = 0; public int deleteAndEarn(int[] nums) { tar=nu
阅读全文
摘要:/** * @Author Niuxy * @Date 2020/6/10 9:42 下午 * @Description 多 selector 多线程的 NIO 服务端 * 使用 NIO 时一定要摒弃 BIO 的阻塞思维,我们的代码面向的是事件,而不是连接 * 至于多次事件完成一个连接的情况,我们可
阅读全文
摘要:直接上源码,查看 register 的实现。我们查看 register 的实现会直接跟进抽象类 SelectableChannel 中: 调用了本身的另一个 register 方法: 该实现为抽象方法,我们直接向下查找 SelectableChannel 子类,查看其实现。因为 SocketChan
阅读全文
摘要:在多道编程的情况下,想要保证线程按我们预想的方式协作,抛开原子性、可见性、有序性的概念,白话总结下心得: 1. 从涉及到操作共享数据的指令入手,保证它们对共享数据操作的正确性。 2. 首先保证单线程情况下,程序执行的正确性。然后判断线程中,与操作共享变量的指令存在数据依赖的指令构成的指令集。保证指令
阅读全文
摘要:最近工作比较忙,水一篇: /** * @Author Niuxy * @Date 2020/6/8 8:54 下午 * @Description 基于双向链表的简单 FIFO 队列 * 锁的粒度很粗,仅针对最上层操作进行互斥同步关系规划 * 最上层方法有两个:put 与 remove * 以 len
阅读全文
摘要:LRU(最近最少使用) 缓存为一段固定大小的缓存,按最近最少使用的淘汰策略对数据进行管理。 一个 LRU 缓存应当支持 put 和 get 操作: 进行 get 操作时,发生 cache miss 返回固定标识。缓存命中在返回数据的同时更新最近使用时间。 进行 put 操作时,如果 key 存在则更
阅读全文
摘要:众所周知,JVM 创建一个对象分三步: 1.在堆内存开辟内存空间。 2.在堆内存中实例化Car里面的各个参数。 3.把对象指向堆内存空间。 为了提高运行效率,编译器在编译代码时可能会对指令进行重排序。重排序的原则是,保证单线程执行结果的正确性,并遵循 happen-before 原则。 指令间的依赖
阅读全文
摘要:Reactor 模型不再介绍,网上有很多。在实现的过程中有一些收获: 1. Reactor 广义上说,事件发生时便会触发为事件注册的处理函数。在注册感兴趣的事件时,需要将处理函数一并绑定到事件上,在 NIO 中我们通过 SelectionKey 的 attachment 携带函数对象。 2. 使用
阅读全文