算法
betterwtl
From Zero to Hero!!!
展开
-
手撕LRU(HashMap + 双向链表)
实现方法:哈希表 + 双向链表这个问题可以用哈希表,辅以双向链表记录键值对的信息。所以可以在 O(1)时间内完成 put 和 get 操作,同时也支持O(1) 删除第一个添加的节点。使用双向链表的一个好处是不需要额外信息删除一个节点,同时可以在常数时间内从头部或尾部插入删除节点。一个需要注意的是,在双向链表实现中,这里使用一个伪头部和伪尾部标记界限,这样在更新的时候就不需要检查是否...原创 2019-07-11 22:29:00 · 1125 阅读 · 0 评论 -
在时间复杂度O(1)内删除单链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点定义如下:public class ListNode { public int val; public ListNode next;}分析:有三种情况:要删除的节点不是尾节点,时间复杂度为O(1)。 单链表中只有一个节点,删除头节点,时间复杂度为O(1)。 单链...原创 2019-08-21 16:53:52 · 1170 阅读 · 1 评论 -
不用库函数实现整数开方 Java版
第一种题型:Input: 4Output: 2Input: 8Output: 2Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated.一个数 x 的开方 sqrt 一定在 0 ~ x 之...原创 2019-08-20 09:30:00 · 500 阅读 · 0 评论 -
大根堆小根堆&TopK问题
首先明确几个概念:大根堆也叫大顶堆,小根堆也叫小顶堆。 大根堆用于升序排序(所以求最小的前k个数用大根堆),小根堆用于降序排序(所以求最大的前k个数(常见的topk问题,基本都是求最大的前k个数)用小根堆)。 堆排序的时间复杂度是O(NlogN),空间复杂度是O(1),所以在海量数据及内存不足的条件下,该排序方法适用。详细的实操内容可参考这篇优秀博文:https://blog.csdn...原创 2019-07-28 09:32:46 · 4802 阅读 · 0 评论 -
Java 交换数组元素 不需要额外空间
private void swap (int[] arr, int i, int j) { arr[i] = arr[i] + arr[j]; arr[j] = arr[i] - arr[j]; arr[i] = arr[i] - arr[j];}原创 2019-07-23 10:09:39 · 550 阅读 · 0 评论 -
Java 判断一个十进制的数转为二进制后有多少位1
假设十进制的数为x,让x和x-1进行&运算,每次都会消耗一位1,计数器统计到x = 0为止。public class Solution { public int countOfOne(int x) { int count = 0; while (x != 0) { x = x & (x - 1); ...原创 2019-07-29 21:10:58 · 1270 阅读 · 0 评论 -
Java 判断链表是否有环
双指针法,一个指针每次移动一个节点,一个指针每次移动两个节点,如果存在环,那么这两个指针一定会相遇。public boolean hasCycle(ListNode head) { if (head == null) { return false; } ListNode l1 = head, l2 = head.next; while (l1 ...原创 2019-07-24 09:17:36 · 143 阅读 · 0 评论 -
两个数交换,不能用其他变量
方法:“异或”位运算符原理:两个相同的数异或之后结果会等于 0,即 n ^ n = 0。 并且任何数与 0 异或等于它本身,即 n ^ 0 = n。public class Main { public static void main(String[] args) { int x = 4; int y = 7; ...原创 2019-07-03 09:43:35 · 98 阅读 · 0 评论 -
排序算法总结
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度:一个算法执行所耗费的时间。 空间复杂度:运行完一个程序所需内存的大小。n: 数据规模 k: “桶”的个数...转载 2019-07-03 11:12:07 · 77 阅读 · 0 评论 -
一个骰子等概率表示1到7
一个骰子6个面均匀,现在有7个互斥事件,怎么扔能使7个事件均匀分布答:一个骰子掷两次,共36种等概率的结果。令其中的35种对应1-7,剩下的一种对应『再掷两次』。比如:第一个骰子不为6时,第二个骰子掷出几就输出几(1-6,每种有五个可能)。第一个骰子为6,且第二个骰子不为6,输出7(有五个可能)。两个骰子都是6,重掷。于是1-7的概率都是5/36。而且永远掷6的概率是0,一定会在有限次内得到输...原创 2019-07-06 15:28:23 · 2292 阅读 · 0 评论 -
拓扑排序
推荐博客:https://www.jianshu.com/p/3347f54a3187转载 2019-07-11 15:12:10 · 84 阅读 · 0 评论 -
Java一行代码求二叉树的深度
public int treeDepth(TreeNode root) { return root == null ? 0 : 1 + Math.max(treeDepth(root.left), treeDepth(root.right));}三目运算符+递归原创 2019-09-08 08:48:33 · 155 阅读 · 0 评论