復(fù)盤|第88場雙周賽
2423. 刪除字符使頻率相同?https://leetcode.cn/problems/remove-letter-to-equalize-frequency/
【暴力枚舉】數(shù)據(jù)范圍不大,直接O(n^2)枚舉,遍歷word里每個字母,刪掉這個字母之后,判斷剩余字符串的頻率是否相同。
壓個行~
【哈希表】O(n)做法,用哈希表統(tǒng)計字符出現(xiàn)次數(shù),freq記錄出現(xiàn)次數(shù)的次數(shù)。最后分類討論,有很多種情況。
2424. 最長上傳前綴?https://leetcode.cn/problems/longest-uploaded-prefix/
【哈希表】每次upload都存到set里,longset時候判斷1-n每個idx是否都在set里。
2425. 所有數(shù)對的異或和?https://leetcode.cn/problems/bitwise-xor-of-all-pairings/
【位運算】直接暴力會超時,假設(shè)nums1 = [a, b], num2 = [c,d,e],暴力解ans = (a ^ c) ^ (a ^ d) ^ (a ^ e) ^ (b ^ c) ^ (b ^ d) ^ (b ^ e)。根據(jù)交換律ans = (a ^ a ^ a) ^ (b ^ b ^ b) ^ (c ^ c) ^ (d ^ d) ^ (e ^ e),根據(jù)異或性質(zhì),a^a = 0所以n個a異或,n是偶數(shù)結(jié)果為0,n是奇數(shù)結(jié)果為a。本題中,有l(wèi)en(nums2)個nums1[i],len(nums1)個nums2[i]。
順便復(fù)習(xí)下異或的基本性質(zhì):
對于任何數(shù),都有 a ^ a = 0, a ^ 0 = a
交換律,a ^ b ^ c = a ^ c ^ b
結(jié)合律,(a ^ b) ^ c = a ^ ( b ^c )
自反性,a ^ b ^ b = a ^ 0 = a
2426. 滿足不等式的數(shù)對數(shù)目?https://leetcode.cn/problems/number-of-pairs-satisfying-inequality/
【樹狀數(shù)組 + 離散化】逆序?qū)ψ龇?,把nums1[i] - nums1[j] <= nums2[i] - nums2[j] + diff移項,得nums1[i] - nums2[i] <= nums1[j] ?- nums2[j] + diff,設(shè)nums1[i] - nums2[i]為A[i],則A[i] - A[j] <= diff。從左到右遍歷A[i],統(tǒng)計<=A[i] + diff的元素個數(shù)。需要一個可以加元素,并查詢<=x元素個數(shù)的數(shù)據(jù)結(jié)構(gòu),包括樹狀數(shù)組、線段樹、SortedList(python專屬有序數(shù)組),時間復(fù)雜度都是O(nlogn)
代碼上,對sorted(A)數(shù)組進(jìn)行二分,找到每個A[i] + diff的up_bound,即<=A[i] + diff的元素個數(shù)。用樹狀數(shù)組查詢下標(biāo)為up_bound的元素個數(shù)。因為diff可以是負(fù)數(shù),所以可以用二分配合進(jìn)行離散化。
也可以用平移的技巧,把所有數(shù)都加一個偏移量變成正數(shù),nums[j] - nums2[j] ?+ diff最小是-3 * 10^4。(偷偷把模板改短點)
【SortedList】有序數(shù)組
【歸并排序】復(fù)習(xí)歸并排序:分治思想,分成兩塊分別排序完再合并。本題中,在歸并排序過程中統(tǒng)計滿足要求的數(shù)對。