![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
排序
abant2
世界上最菜的arcem
展开
-
leetcode 215 第k大元素
解法一:维度大小为k的堆复杂度: O(lNogK)O(lNogK)O(lNogK)解法二:快速选择快排其实还是有挺多细节的,1 必须是右边的哨兵先走,因为要保证最后停在偏小的位置上,然后让哨兵和他交换位置。2 递归终止条件可以设置为 l >= r,可以保证一个元素,或者出错时能停止。class Solution {public: void qChoose(vector<int> &nums, int k, int l, int r) {原创 2021-07-26 18:03:39 · 63 阅读 · 0 评论 -
leetcode 75 只有三个数的数组排序
此题两次遍历很容易做,并且能满足O(1)空间,只要存每个数个数,然后填充即可。此题比较难的是一次遍历的解法,这里我们使用双指针来做。由于我们希望前面都是0,后面都是2,所以用两个指针来维护头和尾,放置0和2.遍历每个元素,如果是2,就放到后面,但是这里可能会遇到2和2交换的情况,所以我们用while来持续放置。如果是0,那么我们直接交换即可。0不用循环,因为2不到后面不行,但是0肯定要遍历到才会交换。class Solution {public: void sortColors(vect.原创 2021-07-25 16:12:12 · 234 阅读 · 0 评论 -
插入排序法
这个应该是最基础的算法了,一直懒得写,今天搞一下。其实就是先把大的牌往右边移动,然后再把当前牌插入到前面即可,需要注意的是,–不要用在数组连续赋值,很容易出错。还是老实点好。#define _CRT_SECURE_NO_WARNINGS#include <tuple>#include <cstdio>#include <vector>#include <algorithm>typedef long long ll;using namespace原创 2021-03-19 22:58:25 · 57 阅读 · 0 评论 -
leetcode 973 最接近原点的K个点 快速排序+优先队列+排序+维护 全四种做法
按顺序做好难坚持,决定开始做每日一题了,希望能坚持下去。解法一:是我一开始想到的解法,就是维护一个长度为K的数组,每个点更新一次。设点的个数为N,复杂度为O(KN)from math import sqrtclass Solution: def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]: dists, result = [], [] for point in po原创 2020-11-09 09:23:53 · 196 阅读 · 0 评论 -
leetcode 1122 数组的相对排序 自定义排序+桶排序 全两种做法
解法一:负数这个题之前就做过类似的,一看题目是负数,这次直接就把右边的映射成负数,左边编码,然后一排序再解码就行了。class Solution: def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]: start = -len(arr2)-2 encoder, decoder = {}, {} for num in arr2:原创 2020-11-14 10:49:20 · 146 阅读 · 0 评论 -
leetcode 1030 距离顺序排列矩阵单元格 桶排序+BFS 两种做法
思路:首先,很容易想到直接排序。但是排序复杂度那么高,排序是不可能排序的。这一看O(N)就能解决。简便的方法是用桶排序,由于是曼哈顿距离,比较好枚举。如果是几何距离的话,放到字典中还需要给字典的键排序,复杂度可能又要到O(NlogN)了。解法一:桶排序正规的桶排序是记录每个节点的位置,在以位置为下标的数组中记录。咱们的原理是一样的,只是可能每个桶有多个点。判断下最大距离,超出字典范围终止掉就好。class Solution: def allCellsDistOrder(self, R: int原创 2020-11-17 09:44:50 · 93 阅读 · 0 评论 -
leetcode 148 链表归并排序 自底向上
此题是经典的链表排序题,链表排序,由于它只能从前向后遍历的特性,很多排序都不能用。比如快速排序,首先找pivot就得遍历一遍,在递归时还需要交换元素,链表交换一个元素可是相当麻烦,递归过程中也会遇到问题,比如新链表头比较难换等。总之,如果用递归做排序,会非常的复杂,有很多细节要处理。此题中用到的归并排序,是目前最快(挺快的,不是最快)的一种排序方法,和快速排序类似。如果陷入递归,也是很麻烦,但我们可以采用自底向上的方法进行归并排序,这样还能减少空间复杂度(没有递归栈)代码如下:# Definition原创 2020-11-24 21:24:08 · 115 阅读 · 0 评论 -
leetcode 164 基数排序 计数排序 桶排序
今天正好做到这个排序题了,需要用到O(N)复杂度的桶排序或者基数排序,正好学习下这两种排序。在学习过程中,还遇到了排序稳定性这样的概念,也可小小总结一下。解法一:基数排序,复杂度O(K(M+N))此解法是把一个元素分成单位?比如生日可以分成年,月份和日期,然后对这三个按顺序排序。基数排序也是这样很妙的原理,每次对数字的一位进行排序,从个位到最高位,所有位排好就ok了。注意,由于高位优先级最高,所以高位的排序应该放在后面。此算法复杂度为O(K(M+N)),其中K为关键字个数,M为关键字取值范围,即桶的个数原创 2020-11-27 17:08:36 · 177 阅读 · 0 评论