思路 总体框架 左部分排好序、右部分排好序,利用 merge 过程让 整体 有序。 merge 的核心是:谁小拷贝谁,直到左右两部分数字耗尽,然后把辅助区间拷回原数组。 两种实现 递归版:自顶向下分治。 非递归版:自底向上,步长 step 从 1 开始每次乘 2,把相邻的两个有序块进行合并。 ...
递归和master公式
递归和master公式 去画调用图是非常重要的,有利于分析递归 从实际上理解递归:递归不是玄学,底层是利用系统来实现的 任何递归函数都一定可以改成非递归,不用系统帮你压栈(系统栈空间,暂时保存,优先弹出栈顶),自己压栈呗(内存空间) 递归改成非递归的必要性: 工程上几乎一定要改,除非确定数据量再大递归也一定不深,归并排序、快速排序、线段树、很多的平衡...
算法笔试中处理输入和输出
目标 · 两种常用 I/O 模板: 数字流(StreamTokenizer) —— 适合大量数字、矩阵、直到 EOF 的多组数据 按行读取(BufferedReader + StringTokenizer) —— 适合“每行一个用例/表达式”的题 · 建议: 尽量用 BufferedReader / StreamTokenizer / PrintWriter,避免 Sc...
二叉树遍历:递归与栈实现(先序/中序/后序)
基础结构 public class Code_10 { // 简单二叉树节点定义 public static class TreeNode { public int val; public TreeNode left, right; public TreeNode(int v) { val = v; } pu...
双端队列:链表实现与数组环形实现
双端队列基础 Deque:头尾都可进可出 常见操作: 头插 insertFront(x)、尾插 insertLast(x) 头删 deleteFront()、尾删 deleteLast() 取头 getFront()、取尾 getRear() 判空 isEmpty()、判满 isFull()(固定容量时) ...
最小栈
目标 实现支持 getMin() 的栈: MinStack() 初始化 void push(int val) 压栈 void pop() 出栈 int top() 取栈顶 int getMin() 取当前最小值(均需 O(1)) 思路 使用 辅助栈 min 或 辅助数组 min[],在每次 push 时同步记录“当前最小值”。 具体策略: 若 v...
用栈实现队列 & 用队列实现栈
概览 目标1:用两个 栈 实现一个 队列(FIFO) 目标2:用一个 队列 实现一个 栈(LIFO) 用两个栈实现队列 思路 使用两个栈: in:专门接收新元素(入队) out:专门负责出队/取队头 只在 out 为空时,将 in ...
队列、栈与循环队列实现
队列基本特性 队列 (Queue):先进先出(FIFO) 加入元素 → 放到尾部 R++ 弹出元素 → 从头部 L++ 判空条件:当 L == R 时为空;当 L < R 时队列中有数。 队列实现 // ...
链表
基础结构 · val: 节点存储数值 · next:指向下一个节点的指针 public static class ListNode { public int val; public ListNode next; public ListNode(int val) { this.val = val; } public Lis...
有序数组查找数
总目标 在有序数组中判断元素是否存在 —— 标准二分查找 在有序数组中找>=num的最左位置 在有序数组中找<=num的最右位置 二分搜索的扩展 —— 不一定要求数组有序,比如寻找峰值 二分答案法 —— 一类重要的算法思想(如最小化最大值、最大化最小值问题) 判断有序数组中是否存在目标数 思路 典型二分查找,时间复杂度 O(log n...