力扣剑指offer第19天

这篇博客探讨了三个计算机科学问题:1) 在二叉搜索树中找到两个节点,使得它们的和为目标值;2) 实现一个日历系统,用于预订事件并检查冲突;3) 在整数数组中查找是否存在距离k的几乎重复元素。这些问题涉及到数据结构和算法的应用,包括二叉搜索树、集合操作和滑动窗口概念。
摘要由CSDN通过智能技术生成
class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
      int n = nums.size();
      set<int> ret;
      for(int i=0; i<nums.size(); i++){
        auto iter = ret.lower_bound(max(nums[i], INT_MIN+t)-t);
        if(iter!=ret.end() && *iter <= min(nums[i], INT_MAX-t)+t) return true;
        ret.insert(nums[i]);
        if(i>=k){
          ret.erase(nums[i-k]);
        }
      }
      return false;
    }
};

56)二叉搜索树中两个节点之和

class Solution{
public:
    bool findTarget(TreeNode* root, int k){
        if(root==nullptr) return false;
        unordered_set<int> nums;
        stack<TreeNode*> stk;
        TreeNode* cur = root;
        while(cur!=nullptr || !stk.empty()){
            while(cur!=nullptr){
                stk.push(cur);
                cur = cur->left;
            }
            cur = stk.top(); stk.pop();
            if(nums.count(k-cur->val)) return true;
            nums.insert(cur->val);
            cur = cur->right;
        }
        return false;
    }
};

57)值和下标之差都在给定的范围内

58)日程表

class MyCalendar {
private:
    map<int, int> calendar;
public:
    MyCalendar() {

    }
    
    bool book(int start, int end) {
      auto iter = calendar.lower_bound(start);
      if(iter!=calendar.end() && iter->first < end) return false;
      if(iter!=calendar.begin() && (--iter)->second > start) return false;
      calendar[start] = end;
      return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值