自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 180

原创 差分数组+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) 计算数组每一项的前缀和: ![在这里插入图片描述](https://img-blog.csdn

2021-05-11 14:50:35 241

原创 并查集 rank+路径压缩

public class UnionFind5 implements UF { // rank[i]表示以i为根的集合所表示的树的层数 // 在后续的代码中, 我们并不会维护rank的语意, 也就是rank的值在路径压缩的过程中, 有可能不在是树的层数值 // 这也是我们的rank不叫height或者depth的原因, 他只是作为比较的一个标准 private int[] rank; private int[] parent; // parent[i]表示第i个元素

2021-05-09 13:45:46 244

原创 最大堆 最小堆

最大堆public class MaxHeap <E extends Comparable<E>>{ private Array<E> data; public MaxHeap(int capacity){ data = new Array<>(capacity); } public MaxHeap() { data = new Array<>(); } pu

2021-05-06 15:44:52 64

原创 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 58

原创 线段树 实现 查询和更新

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 69

原创 希尔排序

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 64

原创 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 76

原创 剑指 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 49

原创 349. 两个数组的交集(集合 / 双指针实现)

两种实现思路第一个思路:将一数组add进不重复集合去重。然后用另一个数组挨个查找包含元素 如果查到就说明是交集 则把这个数记录下来 然后从集合中删掉这个数字。第二个思路:首先将两组数排序 然后使用两个指针去维护这两组数。找到重复的数字后记录下来,然后如果再遇到重复的数字 先判断是否记录过,如果没记录 就记录这个数字。第一种思路清晰 实现简单 但是速度慢第二种略微复杂 但是速度快import java.util.ArrayList;import java.util.Arrays;import.

2021-04-25 17:06:49 194

原创 使用链表(LinkedList) 二叉搜索树(BST) 实现不重复元素集合(Set)

不重复元素集合Set接口定义如下public interface Set<E> { void add(E e); boolean contains(E e); void remove(E e); int getSize(); boolean isEmpty();}复杂度分析:LinkedListSetimport java.util.ArrayList;public class LinkedListSet <E> impl

2021-04-22 10:54:02 189

原创 LeetCode804 唯一的摩尔斯密码词 使用集合实现

思路:将每个词转换为摩斯密码后 输入进java自带的二叉平衡树集合 自动去重后 输出集合的sizeimport java.util.TreeSet;public class Solution { public int uniqueMorseRepresentations(String[] words) { String[] codes = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-".

2021-04-21 16:41:35 65

原创 LeetCode26 删除有序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(num

2021-04-20 09:47:50 60

原创 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 129

原创 BinarySearch 及其几个变种

二分查找(递归形式)二分查找(非递归形式)**lower: 找比target小的 最大值lower_floor : 找到target在数组中最小的索引 没有则返回lowerupper_floor: 找到target在数组中最大的索引 没有则返回lowerupper: 找比target大的 最小值upper_Ceil: 找target在数组中最大的索引 如果没有则输出其upper值lower_ceil : 找target在数组中最小的索引 如果没有则输出upper值public class

2021-04-15 23:30:53 97 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 114

原创 LeetCode875 珂珂吃香蕉

题目描述:珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。思路:使用二分查找法 找出最小速度K 查找边界是 最小吃香蕉速度是1 ,

2021-04-14 15:19:46 369

原创 剑指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 67

原创 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 55

原创 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 54

原创 三路快速排序

三路快速排序主要解决了在数组中有大量重复数字导致排序效率下降的问题。在一个全为同一个数组的样例中,三路快排的时间复杂度为Onimport 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 103

原创 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 151

原创 非递归实现归并排序

import java.util.Arrays;/** * 归并排序 递归实现 * 归并排序的时间复杂度nlogn 其中logn为层数 n 为每层需要操作的次数 所以时间复杂度为nlogn * 递归三要素: 1.明确函数宏观语义 2. 明确函数终止条件 3. 寻找等价式递归自己 * * 归并排序三种优化: * 第一个优化: 如果左数组最大值小于右数组最小值 则说明两端数组无需进行合并 * 第二个优化: 设定更为合理终止条件 在排序数据较少的情况下 使用插入排序要比归并排序更快一些

2021-03-22 22:20:32 183

原创 带三种优化的归并排序--递归实现

带三种优化的归并排序--递归实现import java.util.Arrays;/** * 归并排序 递归实现 * 归并排序的时间复杂度nlogn 其中logn为层数 n 为每层需要操作的次数 所以时间复杂度为nlogn * 递归三要素: 1.明确函数宏观语义 2. 明确函数终止条件 3. 寻找等价式递归自己 * * 归并排序三种优化: * 第一个优化: 如果左数组最大值小于右数组最小值 则说明两端数组无需进行合并 * 第二个优化: 设定更为合理终止条件 在排序数据较少的情况下

2021-03-22 17:02:30 87

原创 <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 405

原创 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 260

原创 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.1idea.

2020-07-02 15:23:42 5643 8

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除