数据结构
巴巴多斯小魔
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 51. 数组中的逆序对 (一维cdq/树状数组模板)
题目 主要就是 两个有序数组,怎么统计 (x,y)其中x>y,x在第一个数组,y在第二个数组的对数。 比如 第一个数组是[4,9],第二个数组是[2,3,5,6] 其中两个指针i,j的走向分别是: i指向4,j指向2. i指向4,j指向3. i指向4,j指向5. (这个时候i应该变了,对于4来说,第二个数组小于4的个数就是5的下标-mid)。 i指向9,j指向5. i指向9,j指向6. 所以每次在i指针要往前移动的时候,统计第二个数组里面有多少个小于 i当前指向的数。 还可将权值离散化,直接上树状数原创 2020-12-05 15:51:42 · 85 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字 (约瑟夫环)
题目 class Solution { public: int lastRemaining(int n, int m) { if(n==1) return 0; int k=lastRemaining(n-1,m); return (m%n+k)%n; } }; class Solution { public: int lastRemaining(int n, int m) { int ans=0;原创 2020-11-30 21:49:09 · 76 阅读 · 0 评论 -
leetcode 421. 数组中两个数的最大异或值(trie模板 巨水)
题目 class Solution { #define Maxbit 31 public: int t[2000005][2],sz=0; void _insert(int x){ int root=0,c; for(int i=Maxbit;i>=0;--i){ c=((x>>i)&1); if(!t[root][c]) t[root][c]=++sz; ro原创 2020-11-20 12:24:49 · 174 阅读 · 1 评论 -
leetcode 164. 最大间距(求一个乱序数组排序后相邻元素最大差值 桶/基数排序 桶这个真的秒哇)
题目 为什么最大间距不会出现在桶内? 桶的大小容量是(maxNum - minNum) / (nums.size() - 1),从数学角度思考其实就是nums中每相连的两个数差值的最终平均差,而我们要求的是nums里面相连两个数最大差值,所以不可能是桶容量也就不可能出现在桶呢,只有当nums里面元素是均匀的,那么最大间距就是桶容量。 桶内两个数的差值都小于 这个平均差,既然是平均差,肯定存在比平均差大的,所以只能是桶与桶之间的。 class Solution { #define INF 0x3f3f3f3原创 2020-11-19 23:10:22 · 196 阅读 · 0 评论 -
leetcode 220. 存在重复元素 III(问是否存在abs(nums[i]-nums[j])<=t,abs(i-j)<=k 思维)
题目 要求i,j之差的绝对值<=k,比如k=3,0 1 2 3,所以滑动窗口里面有k+1个数。 假若现在滑动窗口里面有数1 4 8 10,t=3, 然后{-4,-3,-2,-1},{0,1,2,3},{4,5,6,7}应该这么放。(注意!一个桶只有一个数字哦) 1放在第0个桶, 4放在第1个桶, 7放在第2个桶, 10放在第2个桶, 由于7,10在同一个桶,所以8,10之差的绝对值一定<=t. 其次7,4在相邻的桶,7,10之差的绝对值可能小于<=t,要判断一下。 那有人可能就会有疑问了原创 2020-11-19 09:48:22 · 381 阅读 · 0 评论 -
n分成sqrt(n)排序
采用优先队列合并每一段: (((2 ^ 2) ^2) ^2 ^2) …=n,则2^(2 ^x)=n,x=loglog(n),共有loglog(n)层。 采用优先队列合并的时候,优先队列要是局部变量。全部变量就乱了我没写也不想去写。 #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int a[N],p[N]; struct node{ int val,x,y; bool operator<(c原创 2020-11-13 14:22:51 · 290 阅读 · 0 评论 -
leetcode 215. 数组中的第K个最大元素
题目 因为这题还和男朋友吵了一架,无语。肯定是平常没人吵架,就知道吵我吵我吵我吵我。呵呵呵呵呵呵呵额呵呵呵呵呵呵呵呵呵呵。看来不能留着过年了。 维护一个只有k个元素的小根堆,push的时候<=堆顶就直接不用push了。最后堆顶就是第K大。 class Solution { private: int *heap,k,sz=0; int pop(){ int ans=heap[1];heap[1]=heap[sz--]; int x=1;//从x往下d原创 2020-11-13 14:07:37 · 61 阅读 · 0 评论 -
leetcode 406. 根据身高重建队列(树状数组+倍增)
题目 poj1282 看到这道题我就知道我写过,但是我忘了。 我们直接的做法就是 从高到低排序,个子相同k从小到达排序,挨个放入vector里面,采用vector的insert插入到第几个数。。每次insert复杂度是o(n)。。 还有一种思路是 从低到高排序,格子相同k从大到小排序。k一定要从大到小!! 举个例子把: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 排序后就是:[[4,4], [5,2], [5,0], [6,1],[7,1],[7,0]] ; [原创 2020-11-12 14:29:48 · 123 阅读 · 0 评论