- 博客(27)
- 收藏
- 关注
原创 并查集 rank排序+路径压缩
有两个优化点: rank排序 记录两个合并的根的rank rank低的合并到rank高的上 这个优化目的是避免树的深度增加 路径压缩 parent[p] = parent[parent[p]] 这行代码将该节点指向它父亲节点的父亲节点 可以降低树的深度。 public class UnionFind4 { private int[] parent; // parent[i]记录i的父亲节点 private int[] rank; // rank[i]表示以i为根的集合的深度
2021-05-16 15:05:29
304
原创 差分数组+LeetCode1109
差分数组定义性质及用途 1.定义 对于一个长度大小为n的数组arr[n] 我们可以建立他的差分数组f[n]。其中f[i] = arr[i] - arr[i-1]。 例如 f[2] = arr[2] - arr[1]。 2.性质 (1) 可通过差分数组计算arr[i]的值: arr[i] = f[i] + f[i-1] + ... + f[0] 或 arr[i] = f[i] + arr[i-1] (2) 计算数组每一项的前缀和: { data = new Array<>(capacity); } public MaxHeap() { data = new Array<>(); } pu
2021-05-06 15:44:52
137
原创 LeetCode307 使用线段树实现
class NumArray { private class SegmentTree<E>{ private E[] data; private E[] tree; private Merger<E> merge; public SegmentTree(E[] arr, Merger<E> merge) { this.merge = merge; .
2021-05-06 11:17:47
132
原创 线段树 实现 查询和更新
public class SegmentTree<E>{ private E[] data; private E[] tree; private Merger<E> merge; public SegmentTree(E[] arr, Merger<E> merge) { // 融合器 this.merge = merge; data = (E[]) new Object[arr.len
2021-05-06 10:38:27
148
原创 希尔排序
import java.util.Random; public class ShellSort { private ShellSort() {} public static <E extends Comparable<E>> void Sort(E[] arr) { // 每次希尔排序的间隔 int h = arr.length / 2; while (h >= 1) {
2021-05-04 21:53:06
125
原创 Bubble排序 并进行优化
import java.util.Random; public class BubbleSort { private BubbleSort() {} public static <E extends Comparable<E>> void Sort(E[] arr) { // 每次循环把最大元素放在arr[i]的位置 for (int i = arr.length - 1; i > 0;) { /
2021-05-04 11:31:06
154
原创 剑指 Offer 09. 用两个栈实现队列
import java.util.Stack; class CQueue { // 模拟队列入 private Stack<Integer> stack1; // 模拟队列出 private Stack<Integer> stack2; public CQueue() { stack1 = new Stack<>(); stack2 = new Stack<>(); } .
2021-04-28 08:30:38
116
原创 349. 两个数组的交集(集合 / 双指针实现)
两种实现思路 第一个思路:将一数组add进不重复集合去重。然后用另一个数组挨个查找包含元素 如果查到就说明是交集 则把这个数记录下来 然后从集合中删掉这个数字。 第二个思路:首先将两组数排序 然后使用两个指针去维护这两组数。找到重复的数字后记录下来,然后如果再遇到重复的数字 先判断是否记录过,如果没记录 就记录这个数字。 第一种思路清晰 实现简单 但是速度慢 第二种略微复杂 但是速度快 import java.util.ArrayList; import java.util.Arrays; import.
2021-04-25 17:06:49
360
原创 使用链表(LinkedList) 二叉搜索树(BST) 实现不重复元素集合(Set)
不重复元素集合Set接口定义如下 public interface Set<E> { void add(E e); boolean contains(E e); void remove(E e); int getSize(); boolean isEmpty(); } 复杂度分析: LinkedListSet import java.util.ArrayList; public class LinkedListSet <E> impl
2021-04-22 10:54:02
305
原创 LeetCode804 唯一的摩尔斯密码词 使用集合实现
思路:将每个词转换为摩斯密码后 输入进java自带的二叉平衡树集合 自动去重后 输出集合的size import java.util.TreeSet; public class Solution { public int uniqueMorseRepresentations(String[] words) { String[] codes = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-".
2021-04-21 16:41:35
139
原创 LeetCode26 删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(num
2021-04-20 09:47:50
128
原创 BST 递归实现二叉树: 插入 删除 查找
二叉树遍历: 前序遍历: 本身 左子树 右子树 中序遍历: 左子树 本身 右子树 从小到大排列 后续遍历: 左子树 右子树 本身 二叉树前驱: 当前节点左子树最大的节点 二叉树后继: 当前节点右子树最小的节点 import javax.swing.plaf.InsetsUIResource; public class MyBST <E extends Comparable<E>> { private class Node { public E e;
2021-04-19 16:01:52
218
原创 BinarySearch 及其几个变种
二分查找(递归形式) 二分查找(非递归形式)** lower: 找比target小的 最大值 lower_floor : 找到target在数组中最小的索引 没有则返回lower upper_floor: 找到target在数组中最大的索引 没有则返回lower upper: 找比target大的 最小值 upper_Ceil: 找target在数组中最大的索引 如果没有则输出其upper值 lower_ceil : 找target在数组中最小的索引 如果没有则输出upper值 public class
2021-04-15 23:30:53
186
1
原创 LeetCode 1011. 在 D 天内送达包裹的能力
**题目描述:**传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。 传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。 返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。 示例 1: 输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5 输出:15 解释: 船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示: 第 1 天:1, 2, 3, 4, 5
2021-04-14 16:40:19
242
原创 LeetCode875 珂珂吃香蕉
题目描述: 珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。 返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。 思路: 使用二分查找法 找出最小速度K 查找边界是 最小吃香蕉速度是1 ,
2021-04-14 15:19:46
475
原创 剑指offer40 最小的k个数
这个题目最坑的是 这个输入的k是几 那么输出的个数就是几 如果全是重复的 比如[1,1,1,1,1,1,1] 如果k=2 那么只能输出[1,1] 题目给的这两个样例完全不能体现这一点啊! 而且第一个样例这个[1,2] [2,1] 完全是误导我输出一个有序数列啊 最过分的是 这道题给的错误样例也是一个有序数组啊,但其实根本不需要输出的数组是有序的!只有数字全都有就行了啊 能不能严谨一些啊 /** * 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小
2021-03-31 22:22:52
132
原创 LeetCode215 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-element-in-a
2021-03-31 21:01:11
116
原创 LeetCode75 颜色分类
题目连接:https://leetcode-cn.com/problems/sort-colors/ LeetCode75 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 示例 1: 输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2] 示例 2: 输入:nums = [2,0,1] 输出:[0,1,2] 示例 3:
2021-03-31 16:16:08
109
原创 三路快速排序
三路快速排序 主要解决了在数组中有大量重复数字导致排序效率下降的问题。在一个全为同一个数组的样例中,三路快排的时间复杂度为On import java.util.Random; public class QuickSort { private QuickSort() {}; public static <E extends Comparable<E>> void Sort(E[] arr) { Random rnd = new Random();
2021-03-31 15:18:12
174
原创 LeetCode 剑指51 用归并排序求逆序对个数
求逆序对个数 /** 逆序对问题 leetCode 剑指51 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。 输入一个数组,求出这个数组中的逆序对的总数。 输入: [7,5,6,4] 输出: 5 思路: 在归并排序的过程中就能得到逆序对个数 如果在合并数组的过程中 右数组当前的数字小于 左数组当前的数字 那么左数组从当前的数字 一直到结束 都与右数组形成逆序对 例如 [7,5,6,4] 在叶子节点合并后为可得逆序对:[7,5] [6,4] 然后[5,7] [4,6]
2021-03-23 16:54:11
276
原创 非递归实现归并排序
import java.util.Arrays; /** * 归并排序 递归实现 * 归并排序的时间复杂度nlogn 其中logn为层数 n 为每层需要操作的次数 所以时间复杂度为nlogn * 递归三要素: 1.明确函数宏观语义 2. 明确函数终止条件 3. 寻找等价式递归自己 * * 归并排序三种优化: * 第一个优化: 如果左数组最大值小于右数组最小值 则说明两端数组无需进行合并 * 第二个优化: 设定更为合理终止条件 在排序数据较少的情况下 使用插入排序要比归并排序更快一些
2021-03-22 22:20:32
263
原创 带三种优化的归并排序--递归实现
带三种优化的归并排序--递归实现 import java.util.Arrays; /** * 归并排序 递归实现 * 归并排序的时间复杂度nlogn 其中logn为层数 n 为每层需要操作的次数 所以时间复杂度为nlogn * 递归三要素: 1.明确函数宏观语义 2. 明确函数终止条件 3. 寻找等价式递归自己 * * 归并排序三种优化: * 第一个优化: 如果左数组最大值小于右数组最小值 则说明两端数组无需进行合并 * 第二个优化: 设定更为合理终止条件 在排序数据较少的情况下
2021-03-22 17:02:30
179
原创 <Android>使用RecyclerView控件实现窗口滚动
<第一行代码>使用RecyclerView控件实现横向窗口滚动1. 要达到的效果2. 设置 app/build.gradle 文件3. 在activity_main.xml中添加布局4. 为RcyclerView准备适配器4.1 Fruit水果类4.2 fruit_item.xml4.3 最后是FruitAdapter 自定义的适配器类5. 在MainActivity中使用RecyclerView控件6. 结语 1. 要达到的效果 2. 设置 app/build.gradle 文件 在<
2020-10-20 11:26:37
532
原创 java语言中的NullPointerException空指针异常
java语言中的NullPointerException空指针异常空指针异常空指针异常原因:example:内存原理图 空指针异常 Exception in thread "main" java.lang.NullPointerException at NullPointerTest.main(NullPointerTest.java:14) 空指针异常原因: 出现空指针异常的前提条件是: "空引用"访问实例对象相关的数据时 对会出现空指针异常. example: /* 空指针异常 关于垃
2020-08-04 10:19:08
392
原创 2020年新版pycharm修改C盘中配置文件的方法
2020年新版pycharm修改C盘中配置文件的方法 pycharm在运行后会生成大量的配置文件并默认存入C盘占据了大量的空间,本文将讲述如何修改这些文件的储存位置。 在2020年后pycharm改变了默认的配置文件存储位置 文件 2020前 2020后 idea.system.path ${user.home}/.IntelliJIdea2020.1/system ${user.home}/AppData\Local\JetBrains\IntelliJIdea2020.1 idea.
2020-07-02 15:23:42
6361
8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅