Menu Sidebar
Menu

January 2020

Sum of Mutated Array Closest to Target

给一个数组和一个target, 求一个数字n, 把数组中所有大于n的数字都替换成n以后, 数组的和与target最接近. 这个题是找最接近target的一个数字n, 那么用二叉搜索找即可, 设lo是0, hi是target, 那么mid就是中间假设的答案, 这个答案可以通过题意的改变数组后, 找到和target的差值, 因为我们知道mid是单调递增的, 所以可以用二叉搜索.

Minimum Flips to Make a OR b Equal to c

求最少反转a和b中二进制的0和1的次数, 使得a|b=c. 这个题先要观察a|b=c的特性, 首先我们求出a|b, 通过和c做异或, 我们知道a|b和c有多少位上的数字是不同的. 记录做dd. 通过观察我们知道, 如果这种不同来自于两个情况, 第一是a和b一个是0, 另一个是1, 他们的a|b是1, 如果这个位上的c是0, 那么需要翻转一次. c是1的话, 那么a|b是0, 就是a和b都是0, 那么也只需要翻转一次(任意a和b)即可. 另一种情况是a和b都是1, 如果这个位上的c是0, 那么需要反转两次. 所以这个异或包含了上面两种情况, 但是对于第二种情况, 需要找出, 并且再加一次. 所以问题转化到, 如何在这个结果中找出, a|b都是1的位数? 首先算a&b得到a和b的都是1的位数, 然后再& (a|b)^c, 就得到得到(a|b)^c这个所有的位区别下, a和b都是1的位的个数. 然后加起来即可.

Number of Operations to Make Network Connected

给一个数字n和一个2d数组, 里面是n个数字相连的情况, 问如何调整连接, 让n个数字都相连. 这个题是union-find的经典题. 首先我们知道连接n个node, 至少需要n-1个edge. 然后, 我们做union, 找到有多少个sub components. 把他们都union起来后, 这时需要的edge就是component的数目-1, 因为每个edge都只能连接两个component.

读 Computing the nearest common ancestor

原文地址: http://codinggorilla.com/?p=91&cpage=1 这篇文章介绍了两种算法, Alstrup-Gavoille-Kaplan-Rauhe(AGKR) 和 Schieber-Vishkin. 他们是用来解决 Nearest Common Ancestor (NCA) 或者 Lowest common ancestor (LCA) 问题的. 首先, 文章给出了NCA/LCA问题的定义, 即在树状结构下, 求解任意两个node的最近公用node. 如上图中, node e和 node m 的公用node是a. 这个问题是 Alfred Aho教授提出的, 就是那个ac自动机匹配的那个a.. 文章给出了一个最简单的算法 这个算法是利用两个node的parent信息, 通过两个stack存储node的路径, 进而找到公用node. 这种解法的时间和空间复杂度是o(n). 最坏情况就是刚才的满树下的最左和最右. Schieber-Vishkin算法是由Baruch Schieber 和 Uzi Vishkin 通过简化 Harel and Tarjan的算法得来的. 它的复杂度包含了两个部分, o(n)的preprocessing(预处理)阶段和o(1)的query(解答)阶段. 在预处理阶段, Schieber-Vishkin算法需要重新编码整颗树: 首先假设一棵树是满树时, 对一棵树做inorder traverse. 并且加一个数字计数器, 便有下图: […]

Newer Posts
Older Posts

书脊

这青苔碧瓦堆, 俺曾睡风流觉, 将五十年兴亡看饱.

January 2020
M T W T F S S
 12345
6789101112
13141516171819
20212223242526
2728293031