分析:统计排序再输出。
代码:
class Solution {
public:
static bool cmp(const pair<int, int>& x, const pair<int, int>& y) {
return x.second > y.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> mp;
vector<int> res;
for(int x : nums) {
mp[x]++;
}
vector<pair<int, int>> v(mp.begin(), mp.end());
sort(v.begin(), v.end(), cmp);
for(int i = 0; i < k; i++) {
res.push_back(v[i].first);
}
return res;
}
};
分析:map查找:见注释。
代码:
class MyCalendar {
private:
map<int, int> events;
public:
MyCalendar() {
}
bool book(int start, int end) {
auto it = events.lower_bound(start); //找到第一个>=start的区间
// 与后一个时间段重叠
if (it != events.end() && it->first < end) {
return false; //不能加入
}
// 与前一个时间段重叠
if (it != events.begin() && (--it)->second > start) {
return false; //不能加入
}
events[start] = end; //加入
return true;
}
};
方法一:暴力枚举:超时。
代码:
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
int n = nums.size();
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if(abs((long long)nums[i] - nums[j]) <= t && abs(i - j) <= k) {
return true;
}
}
}
return false;
}
};
方法二:滑动窗口:根据题意可知,如果当前坐标为i,因为要满足第二个条件,所以我们可以从当前i往前推k个位置,然后再检查这个窗口内的数据是否满足第一个条件。
代码:
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
int n = nums.size();
set<int> rec;
for (int i = 0; i < n; i++) {
auto iter = rec.lower_bound(max(nums[i], INT_MIN + t) - t);
if (iter != rec.end() && *iter <= min(nums[i], INT_MAX - t) + t) {
return true;
}
rec.insert(nums[i]);
if (i >= k) {
rec.erase(nums[i - k]); //滑动窗口
}
}
return false;
}
};
分析:先中序遍历保存,然后二分查找。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> res;
void dfs(TreeNode* root) {
if(root) {
dfs(root->left);
res.push_back(root->val);
dfs(root->right);
}
}
bool findTarget(TreeNode* root, int k) {
dfs(root);
for(int x : res) {
cout << x << " ";
}
int low = 0, high = res.size() - 1;
while(low < high) {
int mid = res[low] + res[high];
if(mid == k) {
return true;
}else if(mid > k) {
high--;
}else {
low++;
}
}
return false;
}
};
分析:BST的中序遍历是升序的,而反中序遍历是降序的。因此,在反中序遍历过程中,不断累加当前值,就能得到满足条件的新值。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int sum = 0;
TreeNode* convertBST(TreeNode* root) {
if(root) {
convertBST(root->right);
// cout << root->val << " ";
sum += root->val;
root->val = sum;
convertBST(root->left);
}
return root;
}
};