type
Post
status
Published
date
Jul 4, 2023
slug
summary
tags
LeetCode
category
技术|学习
icon
password
思路
双指针
滑动窗口
二分查找
前缀/差分
动态规划
模板
前缀和
注意长度加一,首位留空
差分
构造方法:
需要在[i, j]区间加上val,则diff[i] += i, diff[j + 1] -= val(如果j + 1越界则不需要减)
计算原数组:
a[i] = a[i - 1] + diff[i]
经典例题
矩阵类
48. Rotate Image
59. Spiral Matrix II
区间类
1288
56
986
287. Find Duplicates in Array
二分法/环检测法
347. Top K Frequent Elements
Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]
要求时间复杂度小于O(nlog(n))
先遍历一遍数组,记录出现频率到count_map ⇒ O(n),
将map里所有的key放入size(k)的最小堆 ⇒ O(nlog(k)),
输出堆中所有元素 ⇒ O(k)
代码实现
/** * 1. build frequency map * 2. insert map entries into heap of size k */ class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int, int> freqMap; for (int num : nums) { if (freqMap.find(num) == freqMap.end()) { freqMap[num] = 0; } else { freqMap[num]++; } } auto comp = [&freqMap](int a, int b) { return freqMap[a] > freqMap[b]; }; priority_queue<int, vector<int>, decltype(comp)> pq(comp); for (auto& entry : freqMap) { pq.push(entry.first); if (pq.size() > k) { pq.pop(); } } vector<int> output; while (!pq.empty()) { output.push_back(pq.top()); pq.pop(); } return output; } };