复盘|第88场双周赛
2423. 删除字符使频率相同 https://leetcode.cn/problems/remove-letter-to-equalize-frequency/
【暴力枚举】数据范围不大,直接O(n^2)枚举,遍历word里每个字母,删掉这个字母之后,判断剩余字符串的频率是否相同。
压个行~
【哈希表】O(n)做法,用哈希表统计字符出现次数,freq记录出现次数的次数。最后分类讨论,有很多种情况。
2424. 最长上传前缀 https://leetcode.cn/problems/longest-uploaded-prefix/
【哈希表】每次upload都存到set里,longset时候判断1-n每个idx是否都在set里。
2425. 所有数对的异或和 https://leetcode.cn/problems/bitwise-xor-of-all-pairings/
【位运算】直接暴力会超时,假设nums1 = [a, b], num2 = [c,d,e],暴力解ans = (a ^ c) ^ (a ^ d) ^ (a ^ e) ^ (b ^ c) ^ (b ^ d) ^ (b ^ e)。根据交换律ans = (a ^ a ^ a) ^ (b ^ b ^ b) ^ (c ^ c) ^ (d ^ d) ^ (e ^ e),根据异或性质,a^a = 0所以n个a异或,n是偶数结果为0,n是奇数结果为a。本题中,有len(nums2)个nums1[i],len(nums1)个nums2[i]。
顺便复习下异或的基本性质:
对于任何数,都有 a ^ a = 0, a ^ 0 = a
交换律,a ^ b ^ c = a ^ c ^ b
结合律,(a ^ b) ^ c = a ^ ( b ^c )
自反性,a ^ b ^ b = a ^ 0 = a
2426. 满足不等式的数对数目 https://leetcode.cn/problems/number-of-pairs-satisfying-inequality/
【树状数组 + 离散化】逆序对做法,把nums1[i] - nums1[j] <= nums2[i] - nums2[j] + diff移项,得nums1[i] - nums2[i] <= nums1[j] - nums2[j] + diff,设nums1[i] - nums2[i]为A[i],则A[i] - A[j] <= diff。从左到右遍历A[i],统计<=A[i] + diff的元素个数。需要一个可以加元素,并查询<=x元素个数的数据结构,包括树状数组、线段树、SortedList(python专属有序数组),时间复杂度都是O(nlogn)
代码上,对sorted(A)数组进行二分,找到每个A[i] + diff的up_bound,即<=A[i] + diff的元素个数。用树状数组查询下标为up_bound的元素个数。因为diff可以是负数,所以可以用二分配合进行离散化。
也可以用平移的技巧,把所有数都加一个偏移量变成正数,nums[j] - nums2[j] + diff最小是-3 * 10^4。(偷偷把模板改短点)
【SortedList】有序数组
【归并排序】复习归并排序:分治思想,分成两块分别排序完再合并。本题中,在归并排序过程中统计满足要求的数对。