自定义博客皮肤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 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) 计算数组每一项的前缀和: ![在这里插入图片描述](https://img-blog.csdn

2021-05-11 14:50:35 395

原创 并查集 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 355

原创 最大堆 最小堆

最大堆 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 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关注的人

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