排序算法
秦枫-_-
慵懒的程序猿
展开
-
最短路算法(网络延迟时间)
Dijkstra算法功能:给出加权连通图中一个顶点,称之为起点,找出起点到其它所有顶点之间的最短距离。将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。用节点 AA「更新」节点 BB 的意思是,用起点到节点 AA 的最短路长度加上从节点 AA.原创 2021-08-03 22:24:24 · 380 阅读 · 1 评论 -
二叉树的垂序遍历(基于前序遍历的升华)
核心思路:自定义排序每个节点有三个属性:值val,行坐标row,列坐标col1、先按列排序,从小到大;2、列相同,再按行排序,从小到大;3、行相同,按值的大小排序,从小到大。所以我们有两种实现思路:用双哈希表或者结构体自定义排序双哈希表:一个表存储列,一个表存储行,用数组每次记录数据,然后对数组进行自定义排序/** * Definition for a binary tree node. * public class TreeNode { * int val; * .原创 2021-07-31 12:16:20 · 223 阅读 · 2 评论 -
h指数:求数组中满足有h个数>=h,n-h个数<=h的最大h
排序遍历:结果必然是0<=h<=n其实两个条件等于一个条件,随意设一个数组,排序后,假设某一位数他是数组中第h个数,且这个h满足我们想要的结果,那么如果它和后面有h个数大于等于h,前面的数必然小于他本身,且前面有n-h个数,所以融合两个条件为一个,h从0开始递增,我们从数组最后一位最大的数向前遍历,h表示当前数(不含自身)后面有h个数>=h,如果num[i]>h,则我们发现h+1也是满足结果的,则h++替换h,同时继续向前判断,直到h不能递增为止class Solution {.原创 2021-07-11 12:07:11 · 383 阅读 · 1 评论 -
Arrays.sort在char数组自定义排序出现意外
今天在写代码时,遇到了一个意外,对char数组自定义排序过程中,报错,按照Arrays.sort()写法我应该没写错class Solution { public String frequencySort(String s) { HashMap<Character,Integer> map=new HashMap<>(); for(int i=0;i<s.length();i++){ map.put(s.charAt(i),map.getOrDef原创 2021-07-03 11:49:10 · 857 阅读 · 2 评论 -
使所有区间的异或结果为零需要修改的元素的最少数(DP)
class Solution { public int minChanges(int[] nums, int k) { int maxn=1024; int [][]dp=new int[k][maxn]; int []g=new int[k]; for(int i=0;i<k;i++){ Arrays.fill(dp[i],0x3f3f3f); //g[i]=0x3f3f3f; } for...原创 2021-05-25 13:26:45 · 122 阅读 · 1 评论 -
利用归并法求数组中的逆序对
关键在于合并的过程中怎么求解逆序对的数量,合并过程中需要将乱序的[left,mid]和[mid+1,right]元素排好序,此时[left,mid]和[mid+1,right]均排好序的情况下,那么如果num[idx1]>num[idx2]代表[idx1,mid]之间的所有元素都>num[idx2],跟num[idx2]组合都是逆序对,此时求解出来的逆序对数量是 mid-idx1+1而因为[left,mid]和[mid+1,right]还并未合并,所以前后两组元素顺序并未改变,这样算法..原创 2021-05-24 16:26:53 · 705 阅读 · 3 评论 -
前K个高频单词(hashmap,priority使用以及自定义排序)
哈希表class Solution { public List<String> topKFrequent(String[] words, int k) { HashMap<String,Integer> map=new HashMap<>(); for(String ch:words){ map.put(ch,map.getOrDefault(ch,0)+1); } List<String> res.原创 2021-05-20 10:29:03 · 96 阅读 · 1 评论 -
判断二叉树的堂兄弟节点BFS+dfs
DFSclass Solution { int x, y; int depthX, depthY; TreeNode fatherX, fatherY; public boolean isCousins(TreeNode root, int x, int y) { this.x = x; this.y = y; getNodeDepthAndHisFather(root, null, 0); return (.原创 2021-05-17 13:06:08 · 192 阅读 · 1 评论 -
数组中两个数的最大异或值(字典树||前缀树)
class Solution { class Tree{ Tree []son=new Tree[2]; } Tree root=new Tree(); void construct(int x){ Tree child=root; for(int i=30;i>=0;i--){ int t=(x>>i)&1; if(child.son[t]==...原创 2021-05-16 14:35:19 · 150 阅读 · 1 评论 -
剑指offer41 数据流中的中位数
考虑使用两个优先队列实现,一个大顶堆B放较小的一半元素,一个小顶堆A放较大的一半元素,,然后比较两者元素数量,同时最开始从B放入元素,相等就A从B中拿走最大的元素,不等就放入A,B从A中拿走最小的元素,如此两者元素数量差维持在1或0,而且这样保证了B的顶元素一定是小于等于A的顶元素,因为从本质上看,B获取元素每次都是从A中拿走最小值,而放入B的时候又同时把它的最大元素给了A。这样造成的结果就是A.size()>=B.size(),最后只要看两者大小,相等取顶元素平均,不等取A顶元素。class M.原创 2021-05-14 18:22:48 · 63 阅读 · 1 评论 -
二叉树的序列化和反序列化
序列化就是把二叉树转化成一个字节序列,反序列化就是将一个字节序列重建成二叉树为什么要序列化? 这样可以使得二叉树的状态信息转换为可以存储或传输的形式,所以你可以认为序列化一个二叉树是编码的过程,而反序列化则是解码的过程什么时候需要序列化?当你想把内存中的对象保存到一个文件中或者数据库中的时候;当你想用套接字在网络上传送对象的时候;当你想通过RMI传输对象的时候;二叉树的序列化本质上是对其值进行编码,更重要的是对其结构进行编码。这里,我们选择先序遍历的编码方式,public class .原创 2021-05-13 17:35:16 · 155 阅读 · 2 评论 -
用dfs或动态规划实现正则表达式匹配
正则表达式是通常被用来检索、替换那些符合某个模式(规则)的文本,即记录文本规则的代码。dfs方法class Solution { public boolean isMatch(String s, String p) { if(p==".*")return true; return getmatch(s,p,0,0); } public boolean getmatch(String s,String p,int m,int n){ if(p.len原创 2021-05-12 21:45:01 · 128 阅读 · 1 评论 -
数组元素拼接成最小值
证明原理过程参考 [link](https://blog.csdn.net/qq_41884662/article/details/115617302)java版本class Solution { public String minNumber(int[] nums) { Integer []num=new Integer[nums.length]; for(int i=0;i<nums.length;i++){ num[i]=nums[i]; .原创 2021-05-10 12:42:56 · 252 阅读 · 2 评论 -
C++链表排序(归并法+快速排序)
我们可以试用归并排序解决:对链表归并排序的过程如下。找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2 步,慢指针每次移动 1步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。对两个子链表分别排序。将两个排序后的子链表合并,得到完整的排序后的链表上述过程可以通过递归实现。递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 1 个节点时,不需要对链表进行拆分和排序。class Solution {.原创 2021-04-18 22:20:14 · 6383 阅读 · 6 评论 -
C++排序算法总结
冒泡法**冒泡法的核心思想:**依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。所以时间复杂度为O(n2) 冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。图片演示://代码演示template<typename T>void bubblesort(T a[],T n)//冒泡法原创 2021-03-08 20:06:08 · 284 阅读 · 7 评论