🗒️LeetCode笔记-数组、哈希Array/Hashing
2023-7-4
| 2023-8-26
0  |  0 分钟
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; } };
技术|学习
  • LeetCode
  • C++: 语言基础、关键字和特性等八股文(持续更新)LeetCode笔记-链表 LinkedList
    目录