当前位置:网站首页>剑指offer专项突击版第19天
剑指offer专项突击版第19天
2022-08-04 11:20:00 【hys__handsome】
剑指 Offer II 056. 二叉搜索树中两个节点之和
中序遍历+双指针
bst中序就是升序序列,然后双指针即可
class Solution {
public:
void get_nums(TreeNode* root, vector<TreeNode*> &nums){
if(!root) return;
get_nums(root->left, nums);
nums.emplace_back(root);
get_nums(root->right, nums);
}
bool findTarget(TreeNode* root, int k) {
vector<TreeNode*> nums;
get_nums(root,nums);
for(int i = 0, j = nums.size()-1; i < nums.size(); i++) {
while(j > i && nums[i]->val + nums[j]->val > k) j--;
if(j > i && nums[i]->val+nums[j]->val == k) return true;
}
return false;
}
};
dfs+哈希表
因为两个结点是相互的,所以不用担心还未遍历整个树就开始判断。
class Solution {
private:
unordered_set<int> us;
public:
bool findTarget(TreeNode* root, int k) {
if(!root) return false;
if(us.count(k-root->val)) return true;
us.insert(root->val);
return findTarget(root->left,k) || findTarget(root->right, k);
}
};
直接遍历导致时间复杂度为 O ( N 2 ) O(N^2) O(N2)
class MyCalendar {
public:
vector<pair<int,int>> ls;
MyCalendar() {
}
bool book(int start, int end) {
for(auto range: ls) {
if(range.first < end && start < range.second)
return false;
}
ls.push_back({
start,end});
return true;
}
};
线段树优化
class MyCalendar {
unordered_set<int> tree, lazy;
public:
bool query(int start, int end, int l, int r, int idx) {
if (r < start || end < l) {
return false;
}
/* 如果该区间已被预订,则直接返回 */
if (lazy.count(idx)) {
return true;
}
if (start <= l && r <= end) {
return tree.count(idx);
}
int mid = (l + r) >> 1;
return query(start, end, l, mid, 2 * idx) ||
query(start, end, mid + 1, r, 2 * idx + 1);
}
void update(int start, int end, int l, int r, int idx) {
if (r < start || end < l) {
return;
}
if (start <= l && r <= end) {
tree.emplace(idx);
lazy.emplace(idx);
} else {
int mid = (l + r) >> 1;
update(start, end, l, mid, 2 * idx);
update(start, end, mid + 1, r, 2 * idx + 1);
tree.emplace(idx);
if (lazy.count(2 * idx) && lazy.count(2 * idx + 1)) {
lazy.emplace(idx);
}
}
}
bool book(int start, int end) {
if (query(start, end - 1, 0, 1e9, 1)) {
return false;
}
update(start, end - 1, 0, 1e9, 1);
return true;
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/fi9suh/solution/ri-cheng-biao-by-leetcode-solution-w06j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
剑指 Offer II 057. 值和下标之差都在给定的范围内
滑动窗口+二分查找
- 由于下标差不能超过 k k k ,所以使用滑动窗口来限制窗口内元素个数为 k + 1 k+1 k+1 个。
- 其次要满足滑动窗口内存在两元素差值小于等于 t t t ,假设当前的元素为 x x x ,那么就只需要在窗口内找到一个数在 [ x − t , x + t ] [x-t, x+t] [x−t,x+t] 范围内。
- 那 x x x 右边的元素就不管了?只要右边的元素会跟 x x x 在同个窗口那么它就会考虑到 x x x ,而不用 x x x 来考虑。
- 由于序列是无序的,如果直接找需要 O ( n k ) O(nk) O(nk) 会TLE,这里就需要只用set来动态维护序列有序性,并且二分快速找到大于等于 x − t x-t x−t 的数集中最小的元素,然后判断这个元素是否<= x + t x+t x+t 。
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
set<int> st;
for(int i = 0; i < nums.size(); i++) {
auto it = st.lower_bound(max(nums[i],INT_MIN+t) - t); //防止key溢出int
if(it != st.end() && *it <= min(nums[i],INT_MAX-t) + t) {
//防止key溢出int
return true;
}
st.insert(nums[i]);
if(i >= k) st.erase(nums[i-k]); //滑动窗口
}
return false;
}
};
边栏推荐
猜你喜欢
Win11怎么重装显卡驱动程序?Win11显卡驱动怎么卸载重装?
中介者模式(Mediator)
The sword refers to the Great Wall Cannon?Official spy photos of Changan's new pickup
请 AI 画家弄了个 logo,网友热议:画得非常好,下次别画了!
北京大学,新迎3位副校长!其中一人为中科院院士!
Win11 file types, how to change?Win11 modify the file suffix
Heap Sort
Leetcode Brush Questions - Path Sum
化繁为简!阿里新产亿级流量系统设计核心原理高级笔记(终极版)
【黄啊码】MySQL入门—1、SQL 的执行流程
随机推荐
Meishe Q&A Room | Meiying VS Meishe Cloud Editing
什么是 DevOps?看这一篇就够了!
123
使用json-server快速搭建本地数据接口
【LeetCode】653. 两数之和 IV - 输入 BST
BOSS 直聘回应女大学生连遭两次性骚扰:高度重视求职者安全,可通过 App 等举报
Zikko launches new Thunderbolt 4 docking station with both HDMI2.1 and 2.5GbE
中介者模式(Mediator)
Learn to use the basic interface of set and map
iMeta | German National Cancer Center Gu Zuguang published a complex heatmap visualization method
mongo-导出数据到mysql
职责链模式(responsibilitychain)
Heap Sort
MySQL不提供数组,只能做成表吗?
手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
使用.NET简单实现一个Redis的高性能克隆版(二)
MATLAB程序设计与应用 3.1 特殊矩阵
『快速入门electron』之实现窗口拖拽
The use of DDR3 (Naive) in Xilinx VIVADO (3) simulation test
vscode插件设置——Golang开发环境配置