- 博客(19)
- 资源 (1)
- 收藏
- 关注
原创 详解 LeetCode 2 两数相加
目录一、题目二、解题思路三、具体代码四、总结一、题目给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 =...
2021-08-23 11:46:10
179
原创 详解 二叉树 Binary Tree 的深度优先遍历和广度优先遍历
目录一,构建二叉树二、二叉树的遍历-深度优先遍历三、层序遍历-广度优先遍历四、总结一,构建二叉树二叉树是在计算机中非常常用的一种数据结构。二叉树中每个节点最多只能有两个子节点。很多时候我们要对整个树进行遍历,遍历操作不仅仅是对二叉树有意义,其他所有的树都可能要进行遍历操作,另外图型数据结构中遍历也是一个非常常规的操作。在这里可以通过二叉树的遍历来体会一下遍历这种操作。一颗二叉树的基本代码如下。/** * 二叉树 * */public class BST<
2021-08-17 18:45:23
540
原创 详解 二分查找法 Binary Search 和 变种 floor和ceil
目录一、二分查找法 Binary Search二、二分查找法的变种 floor和ceil三、总结一、二分查找法 Binary Search二分查找法是一种非常常用的查找方式,但是二分查找法有一定的限制条件,只能在一个有序的数列中,才能使用二分查找法(排序的作用,排序在很多时候是作为其他算法的子过程,处理有序数组比处理无序数组容易很多)。那么二分查找法怎么操作呢?比如说有一个排好序的数组,现在要查找某一个元素。先来比较数组中间元素v的大小和需要查找元素的大小。如果中间元素v等于
2021-08-17 15:13:48
520
原创 详解 LeetCode 1 两数之和
一、题目描述给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums...
2021-08-16 12:14:17
116
原创 四种常见排序算法的对比和总结 插入排序、归并排序、快速排序、堆排序
这里我们要总结的排序算法主要有4个,分别是插入排序Insertion Sort、归并排序Merge Sort、快速排序Quick Sort、堆排序Heap Sort。下面是四种排序算法具体介绍的文章。插入排序:十分重要的O(n^2)级别排序算法 插入排序-InsertionSort归并排序:使用递归和非递归实现 归并排序-MergeSort快速排序:快速排序QuickSort-基本实现和简单优化快速排序优化-随机化快速排序法快速排序优化-双路快速排序法 Quick Sor
2021-08-02 16:20:53
3832
原创 索引堆 Index Heap的详解和代码实现
目录一、为什么需要索引堆二,索引堆的具体实现三、索引堆的优化四、和堆相关的其他问题一、为什么需要索引堆本篇我们将介绍一个相比于普通堆更加高级一些的数据结构 索引堆(Index Heap)。我们先来看一下之前所解介绍的堆有什么问题,为什么要引入索引堆这种新的数据结构?大家可以来看如下的例子。给定一个数组,现在要对整个数组进行heapify(堆化、堆构建)操作,使其变成一个堆。heapify操作完成以后,整个数组变成如下样子,这时候它是一个最大堆。
2021-07-30 15:34:05
471
原创 堆排序Heap Sort实现详解和优化
目录一、基础堆排序二、Heapify三、原地堆排序四、总结一、基础堆排序首先我们用上一篇实现的二叉堆,来实现一个基础的堆排序算法。上一篇链接:堆(Heap)的详解和二叉堆(Binary Heap)的代码实现二叉堆(最大堆)具体的实现代码如下:/** * 在堆的有关操作中,需要比较堆中元素的大小,所以E extends Comparable * @param <E> */public class MaxHeap<E extends C
2021-07-30 15:13:38
391
原创 堆(Heap)的详解和二叉堆(Binary Heap)的代码实现
目录一,堆的定义和介绍二,如何用数组存储二叉堆?三、向最大堆中插入元素 Shift up四、从最大堆中取出元素 Shift Down五、总结一,堆的定义和介绍堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆就是用数组实现的二叉树。堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值。 堆总是一棵完全二叉树。堆是非线性数据结构,相当于一维数组,有两个直接后继。将根节点最大的堆叫做最大堆或大根堆,根
2021-07-16 14:21:38
477
原创 详解 LeetCode 1551 使数组中所有元素相等的最小操作数
题目存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n )。一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= x, y < n )并使 arr[x] 减去 1 、arr[y] 加上 1 (即 arr[x] -=1 且 arr[y] += 1 )。最终的目标是使数组中的所有元素都 相等 。题目测试用例将会 保证 :在执行若干步操作后,数组中的所有元素最终可以全部相等。给你一个整数 n,即数组的长度。请
2021-07-08 18:56:43
708
原创 Java泛型的定义和使用详解
一,为什么我们需要泛型通过分析下面两种情况,来得出我们为什么需要泛型。1.对两个数值类型求和的情况,如下代码,当两个数值是int类型时,需要实现一个方法对int类型的数值求和。当两个数值是Float类型时,需要实现一个方法对Float类型的数值求和。如果两个数值是Double类型时,还需要再实现一个方法对Double类型的数值求和。 public int addInt(int x, int y) { return x+y; } public float addFloat(flo
2021-06-29 18:58:13
8545
原创 归并排序和快速排序的算法思想-分治算法
Merge Sort 和 Quick Sort两种都是O(nlogn)级别的排序算法,两种排序算法不仅更加高效的解决了排序问题,而这两种算法本身背后也隐藏着非常深刻的算法设计思想。下面我们来介绍相关的问题。Merge Sort 和 Quick Sort都使用了分治算法的基本思想。分治算法:顾名思义,分而治之。就是将原问题,分割成同等结构的子问题,之后将子问题逐一解决后,原问题也就得到了解决。Merge Sort 和 Quick Sort都是将原问题分隔成两个子问题,与此同时Merge Sort
2021-06-18 00:01:16
1224
原创 快速排序优化-三路快速排序法 Quick Sort 3 Ways
三路快速排序法 Quick Sort 3 Ways对拥有大量重复键值的数组进行排序时,上篇使用了双路快速排序进行优化,还有一个更加经典的实现方式 三路快速排序法。三路快速排序的思想其实非常简单。我们之前实现的快速排序,都是将整个数组分成两部分,"<=v"的部分和">=v"的部分。而三路快速排序则把整个数组分成三部分,"<v"部分、"=v"部分和">v"部分。我们可以想象一下,这样分割成三部分之后,在递归的过程中,对于"=v"的部分就可以不用管了,只需要递归的继续对"<v
2021-06-11 19:17:14
1308
2
原创 快速排序优化-双路快速排序法 Quick Sort 2 Ways
当用快速排序算法对有大量重复数据的数组进行排序的时,快速排序算法的效率会非常低。这里我们来做一个测试,用快速快速排序和归并排序,对一个100万大小的有大量重复数据的数组(数组中所有的元素都是0到10的数据)进行排序。测试结果如下:QuickSort: 1000000 true 31678msMergeSort: 1000000 true 134ms从上面的测试结果可以看出,快速排序的效率比归并排序的效率低特别多。似乎此时快速排序的算法又退化到了O(n^2)的级别,这是为什么呢,我们来分析
2021-06-11 18:50:27
451
原创 快速排序优化-随机化快速排序法
上篇我们介绍了快速排序算法的基本实现,但是这个基本实现有一个很大的问题。一个100万大小的完全随机的数组,测试结果:QuickSort: 1000000 true 88msMergeSort: 1000000 true 198ms一个100万大小的近乎有序的数组,测试结果:QuickSort: 1000000 true 18892msMergeSort: 1000000 true 43ms对近乎有序的数组排序时,上面实现的快速排序算法效率很差。从上面的两组测试结果中可..
2021-06-11 18:35:33
1297
2
原创 快速排序QuickSort-基本实现和简单优化
基本思想快速排序每次从当前需要排序的部分数组中,选择一个元素,以这个元素为基点。比如像下面这个数组中,选择“4”这个元素作为基点,之后想办法把4这个元素,移动到它在排好序的时候应该所处的位置,“4”这个元素处在这个位置,使得整个数组就有了一个性质,“4”之前所有的元素都是小于“4”的,“4”之后所有的的元素都是大于“4”的。之后再对小于“4”的这部分子数组和大于“4”的这部分子数组,分别继续使用快速排序的思路进行排序,逐渐递归下去完成整个排序过程。为此大家就可以想象了,对于快速排序算法来说,最重
2021-06-11 18:31:08
515
1
原创 使用递归和非递归实现 归并排序-MergeSort
思路当我们要排序一个数组时,归并排序会把这个数组分成两半,再单独对左边和右边的数组进行排序,之后再将它们归并起来。当然了当我们对左边和右边的数组进行排序时,再分别把左边的数组和右边的数组分成两半,然后对每一部分的数组先排序再归并。对于这每一部分的数组,我们依然是先分半再归并。当我们分到一定粒度的时候,每一部分就只有一个元素,那么此时我们不用排序,它本身就是有序的,所以这这时候我们只需要进行归并。归并到上一个层级之后,进一步进行归并,归并到一个更高的层级,逐层的向上归并。直至归并到最后一层的时候,整个
2021-05-12 16:28:42
438
原创 优化你的第一个排序算法 冒泡排序-BubbleSort
思路:1,循环遍历数组,每次都比较相邻两个元素的大小,如果前面的元素大于后面的元素,就进行值交换。遍历完一次之后,数组中最大的值就是数组的最后一个元素。(这个过程像水下面的一个气泡,会慢慢的漂浮上来,所以叫冒泡排序)2,循环遍历剩余未排序的部分,将其中最大的元素移动到当前部分的最后面。3,重复操作2,直到所有的元素都排好序。时间复杂度 O(n^2) public static void bubbleSort(int arr[]){ int length = arr.length
2021-05-08 17:37:59
99
原创 十分重要的O(n^2)级别排序算法 插入排序-InsertionSort
核心思想1,将数组中第一个元素看成一个有序数组,遍历数组中其余无序的元素,将其插入到有序数组部分中。2,无序元素插入到有序数组中的过程,从当前无序元素往前遍历有序数组,如果如果前一个元素大于当前元素,则交换值,反之则退出循环,当前的插入操作结束。插入排序比选择排序效率更高,因为插入排序嵌套循环中的里循环有退出循环的条件,而选着排序没有。时间复杂度 O(n^2) public static void insertionSort(int[] arr){ int length = ...
2021-05-06 18:51:49
262
原创 稳定垫底型选手 选择排序-SelectionSort
核心思想1,遍历数组,找出其中最小(或最大)的元素。和第一个元素交换值,确定排序后第一个元素的值。2,除去已经排序好的元素,再对剩余的元素进行遍历,找到其中最小(或最大)的元素,和剩余元素的第一个元素交换值3,重复步奏2,直到数组中只剩下一个未排序的数,排序完成。时间复杂度 O(n^2)代码实现 public static void selectionSort(int[] arrays){ int len = arrays.length; for(int i = 0; i
2021-05-06 15:30:43
84
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人