算法
算法实战
愚公码农
愚公移山,贵在坚持
展开
-
5.1 贪心算法
# 贪心算法- 最自然智慧的算法- 用一种局部最功利的标准,总是做出在当前看来是最好的选择- 难点在于证明局部最功利的标准可以得到全局最优解- 对于贪心算法的学习主要以增加阅历和经验为主原创 2022-04-08 00:07:31 · 538 阅读 · 0 评论 -
4. 前缀树
前缀树 (prefix tree trie)单个字符串中,字符从前到后的加到一棵多叉树上字符放在路上,节点上有专属的数据项(常见的是pass和end值)所有样本都这样添加,如果没有路就新建,如有路就复用沿途节点的pass值增加1,每个字符串结束时来到的节点end值增加1class Trie { TrieNode root; public Trie() { root = new TrieNode(); }原创 2022-03-29 16:40:50 · 161 阅读 · 0 评论 -
3.6 树的递归应用
树的递归应用。求聚会的快乐值原创 2022-04-06 23:12:37 · 160 阅读 · 0 评论 -
3.5 二叉树递归套路
1. 判断二叉树是完全二叉树2. 头节点是 head, 求任一两个节点 a, b 的最低公共父节点3. 判断是否是满二叉树原创 2022-04-06 20:48:09 · 535 阅读 · 0 评论 -
3.4 二叉树递归套路
1. 判断二叉树是都是完全二叉树完全二叉树,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。2. 判断是否是平衡二叉树它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树 class Info { public int height; public boolean balanced; public Info原创 2022-04-05 22:43:40 · 879 阅读 · 0 评论 -
3.3 二叉树相关面试题
多叉树 序列化 成二叉树二叉树最宽的层有多少节点中序遍历 ,求后继节点纸条折痕问题原创 2022-04-04 17:03:03 · 1102 阅读 · 0 评论 -
3.2 二叉树的打印
二叉树的打印按层遍历计算位置 public static String print(BiNode node) { if (node == null) { return ""; } List<List<Integer>> arr = new ArrayList<>(); Queue<BiNode> currLevel = new LinkedList<&g原创 2022-04-04 12:40:28 · 512 阅读 · 0 评论 -
3.1 二叉树序列化与反序列化
先序、后序,序列化与反序列化按层序列化和反序列化 // 序列化 public Queue<String> serializableLevel(TNode node) { Queue<String> res = new LinkedList<>(); Queue<TNode> queue = new LinkedList<>(); queue.add(node); res.a原创 2022-04-04 13:42:24 · 687 阅读 · 0 评论 -
3. 二叉树
概念二叉树(binary tree)是指树中节点的度不大于2的有序树1. 遍历二叉树,先序,中序,后序(递归序)先序(头左右),中序(左头右),后序(左右头) // 递归遍历二叉树 public static void recursionLoop(Node node) { if (node == null) { return; } // System.out.print(node.value); // 先序原创 2022-03-30 21:05:56 · 766 阅读 · 0 评论 -
2.4 加强堆及其应用
系统提供的堆无法做到的事情︰1)已经入堆的元素,如果参与排序的指标方法变化,系统提供的堆无法做到时间复杂度O(logN)调整! 都是O(N)的调整!2)系统提供的堆只能弹出堆顶,做不到自由删除任何一个堆中的元素,或者说,无法在时间复杂度O(logN)内完成!一定会高于O(logN)根本原因∶无反向索引表给定一个整型数组, int[] arr;和一个布尔类型数组, boolean[] op两个数组一定等长,假设长度为N, arr[i]表示客户编号,op[i]表示客户操作arr = [ 3 , 3 ,原创 2022-04-04 23:38:20 · 421 阅读 · 0 评论 -
2.3 堆排序及相关题目
堆排序极其相关题目原创 2022-03-15 23:35:18 · 206 阅读 · 0 评论 -
2.2随机快排及相关题目
1. 荷兰国旗问题现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。在一个数组中 arr 中,给定一个数 X,使得数组中 < X 的 在左侧, == X 的在中间, >X的在右侧 public void netherlandsFlag(int[] arr, int X) { int less = 0, great = arr.length - 1, i = 0; while (i <= great原创 2022-03-12 16:21:45 · 284 阅读 · 0 评论 -
2.1 归并排序及其相关面试题
1. 归并排序分治思想,分成两个数组,不断分,直到分不了为止, 合并,直到所有的分数组合并完成递归写法public void sort(int[] arr) { if (L == R) { return; }}private void process(int[] arr; int L, int R) { if (L == R) { return; } int mid = L + ((R - L) >> 1); process(arr, L, mid); p原创 2022-03-09 01:12:08 · 166 阅读 · 0 评论 -
2.数组排序
采用分治法:分割:递归地把当前序列平均分割成两半。集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。原创 2022-03-09 01:14:20 · 228 阅读 · 0 评论 -
1.5 单链表相交问题
给定两个单链表,判断是否相交,返回相交节点。单链表可能有环原创 2022-03-29 19:25:27 · 782 阅读 · 0 评论 -
1.4.1 链表荷兰国旗问题,链表交叉,随机链表复制问题
3. 左右两侧链表,变成交叉链表a -> b -> c -> 1 -> 2 -> 3 变成 a -> 1 -> b -> 2 -> c -> 3 结构,奇数中点变成最后一个4. 给一个链表,和一个常数 V,使 < V 的在左侧,=V的在中间,> V 的在右侧5. 复制一个链表,每一个节点有 next,random。...原创 2022-04-02 21:32:49 · 758 阅读 · 0 评论 -
1.4 链表相关,找中点,是否回文
1. 求链表的中点1)输入链表头节点,奇数长度返回中点,偶数长度返回上中点2)输入链表头节点,奇数长度返回中点,偶数长度返回下中点3)输入链表头节点。奇数长度返回中点前一个,偶数长度返回上中点前一个4)输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个快慢指针2. 给定一个单链表的头节点head,请判断该链表是否为回文结构。使用栈实现找到中点,左侧的链表逆序,左右链表进行比较,返回前右侧逆序3. 左右两侧链表,变成交叉链表4. 给一个链表,和一个常数 V,使 <原创 2022-04-01 23:26:23 · 368 阅读 · 0 评论 -
1.3 基础数据结构
1. 链表// 单向链表public class Node { int value; Node next; public Node(int value) { this.value = value; }}// 单向链表反转 public Node reserve(Node n) { Node pre = null, next; while (n != null) { next = n.ne原创 2022-03-09 22:59:55 · 231 阅读 · 0 评论 -
1.2 异或运算相关面试
相关性质0 ^ N = NN ^ N = 0交换律 A ^ B = B ^ A结合律 (A ^ B) ^ C = A ^ (B ^ C)题目1. 不用临时变量交换两个数 // 如果是在数组中,i、j的位置一样,就会将 i 和 j的值都设置为 0 a = A, b = B a = a ^ b; // A ^ B b = a ^ b; // A ^ B ^ B = A a = a ^ b; // A ^ B ^ A = B2.提取一个二进制的最右侧为原创 2022-03-08 20:34:20 · 113 阅读 · 0 评论 -
1.1 二分法
二分法 O(log N)二分法,只要能构建出来能排他的条件,就能使用二分法在有序数组中找值public int findVal(int[] arr, int Q) { int L = 0, R = arr.length - 1, mid; while (L < R) { mid = L + ((R - L) >> 1); if (arr[mid] == Q) { return mid; } if (arr[mid] > Q) {原创 2022-03-07 21:11:07 · 169 阅读 · 0 评论 -
1.算法复杂度、对数器
1. 算法复杂度时间复杂度, O(1), O(N), O(logN), O(N * logN), O(N^2) 等确定算法流程的总操作数量与样本数量之间的表达式关系只看表达式最高阶项的部分常见的常数时间的操作常见的算术运算(+、-、*、/、%等)常见的位运算(>>、>>>、<<、|、&、^ 等)·赋值、比较、自增、自减操作等数组寻址操作总之,执行时间固定的操作都是常数时间的操作。反之,执行时间不固定的操作,都不是常数时间的操作额外空间复原创 2022-03-07 20:23:33 · 181 阅读 · 0 评论