
排序
cx_cs
这个作者很懒,什么都没留下…
展开
-
164. 最大间距
无原创 2023-03-09 13:11:17 · 241 阅读 · 0 评论 -
324. 摆动排序 II
要求:小大小大…。时间O(n)或者空间O(1)思路:法一:桶代替排序class Solution {public: void wiggleSort(vector<int>& nums) { int bucket[5001]={0}; for(int num:nums)bucket[num]++; int len=nums.size(); int small,big;//穿插数字时的上界 //总原创 2022-04-17 22:21:57 · 258 阅读 · 0 评论 -
315. 计算右侧小于当前元素的个数
要求:rt思路:逆序对加强版,相当于统计每个位置的逆序对,树状数组线段树不会,归并原创 2022-04-17 21:10:06 · 367 阅读 · 0 评论 -
31. 下一个排列
要求:rt思路:1243,1324,1342,1423,1432在数组最后往前遍历,一直递增到左边一个如243,然后从43选第一个比2大的3交换,再把42调有序即可class Solution {public: void nextPermutation(vector<int>& nums) { int n=nums.size(); int l=n-2; while(l>=0&&nums[l]>=n原创 2022-03-17 21:09:03 · 191 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
要求:长度为n,数范围0-n,有序,找缺那个思路:明显二分,最后left和right相差1时,还剩两步,无论怎么走,他们最终都会交换位置class Solution {public: int missingNumber(vector<int>& nums) { int left=0,right=nums.size()-1; while(left<=right){ int mid=left+(right-left&原创 2022-03-08 20:18:21 · 61 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
要求:前面一个大于后面一个算逆序思路:暴力超时,树状数组线段树不会,用归并,合并数组时,左边数组大于右边的话,逆序就加上左边剩余的长度class Solution {public: int cnt=0; int reversePairs(vector<int>& nums) { mergeSort(0,nums.size()-1,nums); return cnt; } void mergeSort(int left,原创 2022-03-08 19:57:35 · 188 阅读 · 0 评论 -
剑指 Offer 41. 数据流中的中位数
要求:rt,要动态插入思路:大根堆保留小的一半,小根堆保留大的一半。奇数那个放在大根堆。插入元素时,先插小根堆,如果此时两边个数相等,则把小根堆顶根大根堆顶比较交换;如果小根堆多了一个那直接把小根堆顶插进大根堆class MedianFinder {public: /** initialize your data structure here. */ priority_queue<int,vector<int>,less<int>> maxheap;原创 2022-03-07 11:22:10 · 64 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
要求:rt思路:法一:大根堆,时间复杂度:O(nlogk),其中 n 是数组 arr 的长度。由于大根堆实时维护前 kk 小值,所以插入删除都是 O(logk) 的时间复杂度,最坏情况下数组里 n 个数都会插入,所以一共需要 O(nlogk) 的时间复杂度。class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { if(k==0)return {原创 2022-03-06 19:56:42 · 166 阅读 · 0 评论 -
75. 颜色分类
要求:把只含012的数组排序,要求空间O(1)思路:j遍历,遇到0放左边,遇到2放右边,时间O(n)空间O(1)class Solution {public: void sortColors(vector<int>& nums) { int n=nums.size(); int i=-1,j=0,k=n; //ik固定,j是0跟i换,是2跟k换 while(j<k){ if(num原创 2021-09-28 20:22:20 · 57 阅读 · 0 评论 -
451. 根据字符出现频率排序
要求:字符串降频排列思路:法一:简单粗暴每个频率开一个vector,时间O(n),空间O(n)class Solution {public: string frequencySort(string s) { unordered_map<char,int> hash; int n=s.length(); for(int i=0;i<n;i++) hash[s[i]]++; int maxf原创 2021-09-28 19:35:41 · 91 阅读 · 0 评论 -
347. 前 K 个高频元素
要求:返回前k个高频元素,时间不超O(nlogn)思路:法一:首先记录次数数组,由于时间限制不能排序,故对该数组用小顶堆,初始化堆O(klogk),O(n-k)(logk),空间O(n)class Solution {public: struct cmp{ bool operator()(pair<int,int> &a,pair<int,int> &b){ return a.second>b.second; }原创 2021-09-28 13:24:13 · 67 阅读 · 0 评论 -
快速排序写法
https://blog.youkuaiyun.com/weixin_41685373/article/details/107644002partition主要有三种:填坑、指针交换、单指针原创 2021-09-27 16:54:52 · 61 阅读 · 0 评论 -
215. 数组中的第K个最大元素
要求:返回第k大的数,注意不算去重思路:法一:sort排序后返回,时间O(nlogn),空间O(logn)法二:利用快排的partition函数,partition能找到一个数在数组中的位置,故只要多次调用partition找位置是len-k的即可。这里partition以首位为pivot,采用双指针交换写法。时间好的话O(n),坏的话O(n^2),空间O(1)class Solution {public: int findKthLargest(vector<int>&原创 2021-09-27 16:47:35 · 84 阅读 · 0 评论 -
十大排序算法
https://www.cnblogs.com/guoyaohua/p/8600214.html1、冒泡排序n-1趟每趟两两比较最大的放右边O(n2) 最佳情况:O(n)(改进上一次不交换就结束)2、选择排序左边为有序区,每趟选最小索引放有序区右边,n-1趟O(n2)3、插入排序一个个插到左边有序区,插入要挪O(n2) 最佳情况:O(n)不用挪4、希尔排序间距gap为一组,gap不停/2到1,每个gap为一趟进行插排O(nlogn):用了分治,复杂度很难证明5、归并排序每个数组分原创 2021-09-25 22:16:28 · 70 阅读 · 0 评论