有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和做法. 如图所示,删除结点 i,那么只需找到 i 的前驱 h,然后连 h 到 j,再销毁i 即可.虽然可以安全的删除 i 结点,但是是顺序查找找到 i,之后删除,时间复杂度是 O(n)级别的.具体做法就是:顺序查找整个单链表,找到要删除结点 i 的直接前驱 h,把 h额 next 指向i 的 nex
一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问题分析 之所以认为这个问题有趣,是因为在实现 min 方法的过程 牵涉到了 “缓存一致性”问题.是不是听起来很高大上?哈哈,我臆想的. 思路1:添加一个成员变量总是保存当前栈中最小的元素.该思路的实现代码大致是这样的: public class MinStack { private LinkedLi
算法导论的第四章对于divide-conquer进行了阐述, 感觉这本书特别在,实际给出的例子并不多,更多其实是一些偏向数学性质的分析, 最重要的是告诉你该类算法分析的一般性策略. 估计 首先是估计算法的时间复杂度,这里我感觉大多数情况下该类算法的时间复杂度可以由两种策略来完成. master method 这种方式简单, 准确, 个人认为一般能用这种尽量使用这种. 对于常数 a >= 1, b > 1, T(n) = a T ( n / b ) + f(n), 也就是说算法T对于规模为n的问
对于一个int数组,请编写一个选择排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 冒泡排序: package test; public class BubbleSort { public int[] bubbleSort(int[] A, int n) { int temp; for (int j = 0; j < n - 1; j++) { for (int i = 0; i < n