![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
关于算法相关,包括Leetcode,剑指offer等等
锥栗
这个作者很懒,什么都没留下…
展开
-
【经典排序算法】总集
十个经典排序算法特性对比:注:稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。(in-place)原地排序:在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换。(out-place)非原地排序:需要利用额外的数组来辅助排序。...原创 2021-02-12 20:25:17 · 121 阅读 · 0 评论 -
【剑指offer】总集
算法和算法题的目标,主要可以分为:“增 删 改 查” 这四种。而数据结构则包括了:数组,字符串,堆,栈,队列,链表,树,集合等等。所以实际上,在数组,字符串,堆,栈,队列,链表,树,集合等等这些不同的数据结构上,执行 “增 删 改 查”这任意一种(或以上)任务,它们之间只需排列组合一番,就形成了现在数量繁多的算法题目(剑指offer,LeetCode)。前人在解决这些问题时,也逐渐总结形成了针对不同数据结构,执行不同任务时候的一些方法(如:快慢针——链表/查找,二分查找——数组/查找,十种排序——数组/原创 2021-03-25 09:10:39 · 533 阅读 · 0 评论 -
【Leetcode】总集篇
题目索引我的索引结构是:数据结构1:|____ 任务目标 - 题目1|____ 任务目标 - 题目2|____ …|____ 特殊算法:|____ |____ 任务目标 - 题目n|____ |____ 任务目标 - 题目n+1|____ |____ …数据结构2:|____ 任务目标 - 题目1|____ 任务目标 - 题目2|____ …|____ 特殊算法:|____ |____ 任务目标 - 题目n|____ |____ 任务目标 - 题目n+1|_原创 2021-05-26 16:37:44 · 635 阅读 · 0 评论 -
【其他算法题】华为机试 - 汽水瓶/明明的随机数/转16进制
汽水瓶某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。数据范围:输入的正整数满足1≤𝑛≤1001≤n≤100注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M输出描述:对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。示例131081015。原创 2024-06-10 22:08:41 · 391 阅读 · 0 评论 -
【剑指offer】数据结构——队列 栈 堆
【代码】【剑指offer】数据结构——队列 栈 堆。原创 2023-05-30 19:21:00 · 153 阅读 · 0 评论 -
【剑指offer】数据结构——树
【代码】【剑指offer】数据结构——树。// 请实现两个函数,分别用来序列化和反序列化二叉树// 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格// 式保存为字符串,从而使得内存中建立// 起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序// 的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列原创 2023-05-29 15:04:56 · 692 阅读 · 0 评论 -
【剑指offer】数据结构——链表
遍历法图解(非leetcode中的解法)// 输入一个链表的头节点,从尾到头反过来返回每个节点// 的值(用数组返回)。原创 2023-05-28 15:12:15 · 866 阅读 · 1 评论 -
【剑指offer】数据结构——字符串
StringBuilder辅助法。//05. 替换空格//请实现一个函数,把字符串 s 中的每个空格替换成"%20"。s原创 2023-05-28 14:31:14 · 1135 阅读 · 0 评论 -
【剑指offer】数据结构——数组
找重复的数,且数取值在数组长度范围内,大部分数肯定是不重复的,将它们摆放成数字和索引相同的数组,即{0, 2, 3, 1}我们希望摆成{0, 1, 2, 3}。// 如果数组中有重复的数字,把重复的数字放到参数duplication[0]中。// 字是重复的,但不知道有几个数字是重复的。// 如果数组中有重复的数字,函数返回true,否则返回false。// 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每。// 1,0,2,5,3},那么对应的输出是第一个重复的数字2。原创 2023-05-28 13:29:39 · 946 阅读 · 0 评论 -
【剑指offer】数据结构——数
/ 62. 圆圈中最后剩下的数字// 力扣// 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里// 删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下// 的最后一个数字。// 例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个// 数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。// 牛客// 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此//。原创 2023-05-27 18:27:39 · 1216 阅读 · 0 评论 -
【数据结构】HashTable 哈希表
数据结构源码实现类import java.util.TreeMap;public class HashTable<K, V> { private static final int upperTol = 10; private static final int lowerTol = 2; private static final int initCapacity = 7; private TreeMap<K, V>[] hashta.原创 2021-12-13 20:16:59 · 188 阅读 · 0 评论 -
【数据结构】AVL Tree 二叉平衡树
AVL树是一种自平衡的二叉搜索树(BST),由两位苏联计算机科学家G. M. Adelson-Velsky和E. M. Landis在1962年发明,AVL树的名字就是取自他们的姓氏首字母。AVL树是一种高度平衡的二叉搜索树,其中每个节点都保持其左右子树的高度差(也称为平衡因子)不超过1。在AVL树中,每个节点都有一个平衡因子,定义为该节点的左子树高度减去右子树高度。平衡因子可以是-1、0或1。原创 2021-12-12 11:00:11 · 429 阅读 · 0 评论 -
【数据结构】UnionFind 并查集-2
【代码】【数据结构】UnionFind 并查集-2。原创 2021-12-08 16:31:37 · 452 阅读 · 0 评论 -
【数据结构】UnionFind 并查集-1
【代码】【数据结构】UnionFind 并查集-1。原创 2021-12-08 16:25:01 · 360 阅读 · 0 评论 -
【数据结构】Trie 字典树
数据结构源码实现类import java.util.TreeMap;public class Trie { private class Node { public boolean isWord; public TreeMap<Character, Node> next; public Node(boolean isWord) { this.isWord = isWord; .原创 2021-12-07 20:59:00 · 77 阅读 · 0 评论 -
【数据结构】SegmentTree 线段树
数据结构源码接口public interface Merger<E> { E merge(E a, E b);}实现类public class SegmentTree<E> { private E[] tree; private E[] data; private Merger<E> merger; public SegmentTree(E[] arr, Merger<E> merger) {.原创 2021-12-06 10:55:27 · 141 阅读 · 0 评论 -
【数据结构】PriorityQueue 优先队列
数据结构源码实现类public class PriorityQueue<E extends Comparable<E>> implements Queue<E> { private MaxHeap<E> maxHeap; public PriorityQueue() { maxHeap = new MaxHeap<>(); } @Override public int getSi.原创 2021-12-05 15:38:12 · 85 阅读 · 0 评论 -
【数据结构】MaxHeap 大顶堆
数据结构源码实现类import java.util.Random;public class MaxHeap<E extends Comparable<E>> { private Array<E> data; public MaxHeap(int capacity) { data = new Array<>(capacity); } public MaxHeap() { data =.原创 2021-12-05 15:13:49 · 739 阅读 · 0 评论 -
【数据结构】Map 映射
数据结构源码接口public interface Map<K, V> { void add(K key, V value); V remove(K key); boolean contains(K key); V get(K key); void set(K key, V value); int getSize(); boolean isEmpty();}实现类public class LinkedList原创 2021-12-04 20:39:05 · 183 阅读 · 0 评论 -
【数据结构】Set 集合
数据结构源码接口public interface Set<E> { void add(E e); void remove(E e); boolean contains(E e); int getSize(); boolean isEmpty();}实现类public class LinkedListSet<E> implements Set<E> { private LinkedList<E原创 2021-12-04 16:49:11 · 1849 阅读 · 0 评论 -
【数据结构】Binary Search Tree(BST) 二分搜索树
数据结构源码实现类import java.util.*;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;/** * 二分搜素树 —— BST * @param <E> */public class BST<E extends Comparable<E>> { /** * 维护内部类,结点Node */ privat原创 2021-12-02 20:43:36 · 98 阅读 · 0 评论 -
【数据结构】LinkedList 链表
数据结构源码实现类public class LinkedList<E> { /** * 内部类,定义结点Node */ private class Node { public E e; public Node next; public Node(E e, Node next) { this.e = e; this.next = next; }原创 2021-11-29 09:36:42 · 89 阅读 · 0 评论 -
【数据结构】LoopQueue 循环队列
数据结构源码接口public interface Queue<E> { int getSize(); boolean isEmpty(); void enqueue(E e); E dequeue(); E getFront();}实现类public class LoopQueue<E> implements Queue<E> { private E[] data; private int原创 2021-11-28 20:36:42 · 204 阅读 · 0 评论 -
【数据结构】Queue 队列
数据结构源码接口public interface Queue<E> { int getSize(); boolean isEmpty(); void enqueue(E e); E dequeue(); E getFront();}实现类public class ArrayQueue<E> implements Queue<E> { private Array<E> array;原创 2021-11-28 11:09:58 · 108 阅读 · 0 评论 -
【数据结构】Stack 栈
数据结构源码接口public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e); E pop(); E peek();}实现类public class ArrayStack<E> implements Stack<E> { Array<E> array; public ArrayStac原创 2021-11-28 09:58:41 · 636 阅读 · 0 评论 -
【数据结构】Array 数组
数据结构Array数据结构:public class Array<E> { private E[] data; // 数组实体,此时data.length为数组总容量 private int size; // 元素个数 /** * 无参构造函数,默认数组容量size为10 */ public Array() { this(10); } /** * 构造函数,传入数组的容量size构造Ar原创 2021-11-27 21:05:56 · 336 阅读 · 0 评论 -
【Leetcode】442. 数组中重复的数据
题目描述给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?题解执行用时:7 ms, 在所有 Java 提交中击败了30.79%的用户内存消耗:47.3 MB, 在所有 Java 提交中击败了56.24%的用户通过测试用例:28 / 28import java.util.*;/** * 本题nums数组的数字范围,在 [1, nums.l原创 2021-11-22 20:09:17 · 91 阅读 · 0 评论 -
【Leetcode】443. 压缩字符串
题目描述给你一个字符数组 chars ,请使用下述算法压缩:从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :如果这一组长度为 1 ,则将字符追加到 s 中。否则,需要向 s 追加字符,后跟这一组的长度。压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。请在 修改完输入数组后 ,返回该数组的新长度。你必须设计并实现一个只使用常量额外空间的算法来解决此问原创 2021-11-20 10:07:10 · 134 阅读 · 0 评论 -
【Leetcode】678. 有效的括号字符串
题目描述给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:任何左括号 ( 必须有相应的右括号 )。任何右括号 ) 必须有相应的左括号 ( 。左括号 ( 必须在对应的右括号之前 )。可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。一个空字符串也被视为有效字符串。题解贪心算法根据左括号能够匹配的数量,维护一个数字区间[ 左括号能匹配的最小数量leftMatchMin , 左括号能够匹配的最大数量left原创 2021-11-18 20:36:56 · 650 阅读 · 0 评论 -
【Leetcode】86. 分隔链表
题目描述给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。题解非常简单粗暴又有效,让small用于链接小结点,large用于链接大结点,最后两个结点链接起来。执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:37.6 MB, 在所有 Java 提交中击败了86.29%的用户通过测试用例:168 / 168import java原创 2021-11-17 20:34:54 · 553 阅读 · 0 评论 -
【Leetcode】445. 两数相加 II
题目描述给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。题解坑:这题只能逐位计算,不能把链表整个直接转为一个整体 int 来计算,因为给的测试用例会溢出,求和会导致溢出。逐位计算的话,我们希望的是从低位到高位遍历,求和之后的进位可以记录下来,用于下一位遍历的求和。但是题目链表给的是从高位到低位的顺序,所以我们必须先想办法,让我们能从低位到高位遍历。我的做法是原创 2021-11-15 19:45:19 · 843 阅读 · 0 评论 -
【Leetcode】125. 验证回文串
题目描述题解思路很好想,先去除非字母的字符,然后所有字母大写变小写,然后判断是不是回文字符。但是测试用例居然把数字字符算进要考虑的范围了,太坑了。所以最后还需要加判断是否是数字,是字符或者数字都可以加进要判断的字符串中。执行用时:4 ms, 在所有 Java 提交中击败了46.12%的用户内存消耗:38.5 MB, 在所有 Java 提交中击败了56.90%的用户通过测试用例:480 / 480class Solution { public boolean isPalindrome(S原创 2021-11-14 20:30:49 · 411 阅读 · 0 评论 -
【Leetcode】295. 数据流的中位数
题目描述中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。题解用大顶堆和小顶堆分别存储一般数据,大顶堆存较小一半数据,小顶堆存储较大一半数据。如 maxHeap [3 2 1], m原创 2021-11-07 17:10:41 · 88 阅读 · 0 评论 -
【Leetcode】1047. 删除字符串中的所有相邻重复项
题目描述给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一题解队列辅助法:利用队列 d 作为一个缓存,逐个读取字符并存入缓存中,存入缓存之前需要进行判断,如果发现连读取两个重复字符,在缓存中删除。最后将缓存转化为String输出。执行用时:21 ms, 在所有 Java 提交中击败了49.74%的用户内存消耗:38.7 MB, 在所有 Java 提原创 2021-11-07 16:32:30 · 143 阅读 · 0 评论 -
【Leetcode】74. 搜索二维矩阵
题目描述题解暴力解法执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:38.1 MB, 在所有 Java 提交中击败了7.76%的用户通过测试用例:133 / 13class Solution { public boolean searchMatrix(int[][] matrix, int target) { for (int[] ints : matrix) { for (int i : ints) {原创 2021-11-05 16:50:13 · 72 阅读 · 0 评论 -
【Leetcode】189. 旋转数组
题目描述给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?题解翻转数组法翻转数组其实就是头尾指针互换元素,然后头尾指针向中间遍历,如此循环。我们需要旋转数组,其实只需要做三次旋转即可。执行用时0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:55.3 MB, 在所有 Java 提交中击败了38.26%的用户通过测原创 2021-11-04 11:03:52 · 3287 阅读 · 0 评论 -
【Leetcode】40. 组合总和 II
题目描述给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。注意:解集不能包含重复的组合。题解我们可以看这道题的前身【Leetcode】39. 组合总和,candidates中的元素是可以重复使用的,但是在这里不行。共同点是,组合本身不能重复。不重复取元素对象在回溯搜索里,可以通过安排for循环的起点来实现。但是如果candidates本身存在重复数原创 2021-10-30 10:08:33 · 4304 阅读 · 0 评论 -
【Leetcode】135. 分发糖果
题目描述老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?题解左遍历+右遍历执行用时:3 ms, 在所有 Java 提交中击败了46.47%的用户内存消耗:40.2 MB, 在所有 Java 提交中击败了5.03%的用户通过测试用例:48 / 48class Sol原创 2021-11-02 16:16:36 · 4013 阅读 · 0 评论 -
【经典排序算法】2. 选择排序
代码如下:public class Main { public static void main(String[] args) { int[] arr = {3, 3, 5, 6, 2, 1}; arrPrint(arr); SelectSort(arr); arrPrint(arr); } // 选择排序算法 // i从头遍历至倒数第二位,当前遍历位i需要替换为最小值, // 我们在i之后使指针j原创 2021-02-14 16:40:53 · 228 阅读 · 5 评论 -
【经典排序算法】10. 基数排序
基数排序又是桶排序的改进,基数排序根据每个位数只包含10个数,开辟10个桶,通过对位数低到高地计数数组元素每个位数的数值(类似于计数排序),划分到对应桶中完成排序。对于十进制整数来说,基数排序是非常高效的。public class Main { public static void main(String[] args) { int[] arr = {31, 5, 6, 2, 10, 17, 41}; System.out.print("排序前:");原创 2021-03-12 10:02:10 · 254 阅读 · 0 评论