算法
文章平均质量分 52
GxDong_
这个作者很懒,什么都没留下…
展开
-
[Top-K] 海量数据的Top-K问题/出现频率Top-K问题
描述最近在面试中有被问到,Top-K的相关问题,在此做以总结,希望对后续面试的小伙伴有帮助题目要素1.海量数据(大数量,小内存)2.排名前K变体:海量数据的词频问题例子先举一个比较有趣的例子。已知现在有25匹马,5条赛道,假设不考虑马的疲劳问题,不可以使用计时器记录每一匹马的时间。最少需要多少次比赛才能选出25匹马中的TOP3。答案:7次思路:❗ 解决此类问题,脑海中一定要从哪些马没有资格成为TOP3的思想出发。首先,对25匹马进行5次比赛,淘汰每一组中排名靠后的两匹马,因为这些原创 2021-03-25 21:21:23 · 791 阅读 · 0 评论 -
[算法] 并查集的Java实现
最近阅读到一篇关于并查集的博客文章,自己也研究一下。并查集算法的主要概念初始化(Init):初始化定义,将每个对象的父节点指向自己;查询(Find):查询两个元素是否在同一个集合中;合并(Union):把两个不相交的集合合并为一个集合。以LeetCode中547. 省份数量为例解释算法。题目中给定一个图的邻接矩阵isConnected[ ][ ],矩阵中0表示不相连,1表示相连;需要输出集合总数。class Solution { public int findCircleNum(in原创 2021-02-23 15:34:07 · 149 阅读 · 0 评论 -
[算法] 广度优先算法通用模板
广度优先算法和深度优先算法类似是较为优雅的暴力算法,时间复杂度为o(n^2)解题模板定义Queue加入初始条件队列不为空的while循环3.0 业务处理3.1 for循环将队列元素逐一取出进行处理3.2 将下一条件放入队列中3.3 将符合条件的一种结果放入结果集中返回结果集接下来用LeetCode中的一些题目来验证如上解题模板题目展示1. 二叉树的层序遍历LeetCode-102.二叉树的层序遍历根据要求编写代码class Solution { public Lis原创 2021-01-13 12:16:45 · 342 阅读 · 1 评论 -
(八) 堆排序Java实现
堆排序核心:利用大顶堆进行进行排序,每次排序将最大数出去放入数组最后。动图代码public static void heapSort(int arr[]) { int temp = 0; for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } for (int j = arr.length - 1; j > 0; j--) {原创 2020-06-28 14:13:29 · 265 阅读 · 0 评论 -
[Java] 面试常考排序算法的Java实现
本文对常见、常用、面试中常考的排序算法,使用Java语言实现,并对个算法的时间复杂度进行了分析。排序算法,这一篇就够了原创 2020-06-24 15:01:33 · 419 阅读 · 0 评论 -
(七) 基数排序Java实现
基数排序核心:从元素的个位开始,按照数字放入0-19(不包含负数0-9)号桶,顺序取出,再按照倒数第二位排序动图(不考虑负数)代码(不考虑负数)public static void radixSort(int[] arr) { // 二维数组模拟桶 int[][] bucket = new int[10][arr.length]; // 一维数组模拟索引 int[] bucketCounts = new int[10]; // 确定数组最大数的位数原创 2020-06-24 14:51:03 · 282 阅读 · 0 评论 -
(六) 归并排序Java实现
归并排序核心:将数据分为单个数据,对单个数据进行不断组合并排序关键词:分治动图代码public static void mergeSort(int [] arr,int left,int right,int [] temp){ if (left<right){ int mid = (left+ right)/2; mergeSort(arr,left,mid,temp); mergeSort(arr,mid+1,right,tem原创 2020-06-24 14:43:15 · 278 阅读 · 0 评论 -
(五) 快速排序Java实现
快速排序核心:选定一个数作为中间数,比较其余元素,分别放在两边,对两边的数进行同样的的递归操作关键词:一个while循环、先定位后交换、递归、避免死循环动图代码public static void quicksort(int[] arr, int left, int right) { int l = left; int r = right; int pivot = arr[(left + right) / 2]; while (l < r) {原创 2020-06-24 14:39:32 · 240 阅读 · 0 评论 -
(四) 希尔排序Java实现与改进
希尔排序解决插入排序,位置靠后的元素需要对数组进行不断位移的问题核心: 分组插入排序关键词:步长、3个for循环(2个for一个while)动图(移动法)代码(交换法)public static void shellSort(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < arr.length; i++) {原创 2020-06-24 14:37:00 · 260 阅读 · 0 评论 -
(三) 插入排序Java实现
插入排序核心:将原队列模拟为两个表,从无序表中取出数据比较后有序的插入有序表关键词:插入移动、一个for一个while、动图代码public static void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { int insertVal = arr[i]; int insertIndex = i - 1; while (insertIndex >原创 2020-06-24 14:31:41 · 219 阅读 · 0 评论 -
(二) 选择排序Java实现
选择排序核心:遍历查找最小的元素放到前面,继续遍历剩下的数关键词:两个for循环、先遍历后交换动图代码public static void selectSort(int[] arr) { for (int j = 0; j < arr.length - 1; j++) { int minIndex = j; int min = arr[j]; for (int i = 1 + j; i < arr.length; i++)原创 2020-06-24 14:28:28 · 235 阅读 · 0 评论 -
(一) 冒泡排序Java实现与改进
冒泡排序核心:遍历相邻元素,逆序就交换关键词:交换、两个for循环动图代码public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { int te原创 2020-06-24 14:24:05 · 296 阅读 · 0 评论