首页 > 其他分享 >【线段树】【leetcode 729. 我的日程安排表 I】

【线段树】【leetcode 729. 我的日程安排表 I】

时间:2023-07-11 16:36:02浏览次数:34  
标签:right int null mid Seg 日程安排 left leetcode 729

class MyCalendar {
    class Seg {
        int l;
        int r;
        boolean val;
        Seg left;
        Seg right;

        public Seg(int x, int y) {
            this.l = x;
            this.r = y;
            this.val = false;
            this.left = null;
            this.right = null;
        }

        public boolean exist(int left, int right) {
            if(this.val){
                return true;
            }
            int mid = (this.l + this.r) / 2;

            if (left > mid) {
                if (this.right != null) {
                    return this.right.exist(left, right);
                }
                return false;
            } else if (right <= mid) {
                if (this.left != null) {
                    return this.left.exist(left, right);
                }
                return false;
            } else {
                boolean exist = false;
                if (this.left != null) {
                    exist = this.left.exist(left, mid);
                }
                if (this.right != null) {
                    exist = exist | this.right.exist(mid + 1, right);
                }
                return exist;
            }
        }

        public void insert(int start, int end) {
            if (start <= this.l && this.r <= end) {
                this.val = true;
                return;
            }
            int mid = (this.l + this.r) / 2;
            if (start > mid) {
                if (this.right == null) {
                    this.right = new Seg(mid + 1, this.r);
                }
                this.right.insert(start, end);
            } else if (end <= mid) {
                if (this.left == null) {
                    this.left = new Seg(this.l, mid);
                }
                this.left.insert(start, end);
            } else {
                if (this.right == null) {
                    this.right = new Seg(mid + 1, this.r);
                }
                if (this.left == null) {
                    this.left = new Seg(this.l, mid);
                }
                this.right.insert(mid + 1, end);
                this.left.insert(start, mid);
            }
        }
    }

    Seg root = null;

    public MyCalendar() {
        root = new Seg(0, 1000_000_000);
    }

    public boolean book(int start, int end) {
        if (root.exist(start, end-1)) {
            return false;
        }
        root.insert(start, end-1);
        return true;
    }

    public static void main(String[] args) {
        MyCalendar calendar = new MyCalendar();
        System.out.println(calendar.book(47,50));
        System.out.println(calendar.book(15,25));
        System.out.println(calendar.book(20,30));
    }
}

/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar obj = new MyCalendar();
 * boolean param_1 = obj.book(start,end);
 */

 

标签:right,int,null,mid,Seg,日程安排,left,leetcode,729
From: https://www.cnblogs.com/fishcanfly/p/17545132.html

相关文章

  • leetcode328奇偶链表
    思路:先将寄链表连接起来;再将偶链表连接起来;最后将寄链表和偶链表一起连起来。首先需要一个指针结构体去记录下偶链表的表头。最后才能将两个链表连接起来。 ListNode*odd=head;LisrNode*even=head->next;ListNode*evenhead=head->next;//必须这么做,每个链表表头必须用另......
  • LeetCode -- 352场周赛
     思路:动态规划首先计算原数组的条件数组,及所有的元素都%2f[i]表示从零到i中选,且以第i项为结尾的最长奇偶子数组。classSolution{public:intlongestAlternatingSubarray(vector<int>&nums,intthreshold){intn=nums.size();vector<int>d(n......
  • [Leetcode Weekly Contest]351
    链接:LeetCode[Leetcode]6451.找出最大的可达成数字给你两个整数num和t。如果整数x可以在执行下述操作不超过t次的情况下变为与num相等,则称其为可达成数字:每次操作将x的值增加或减少1,同时可以选择将num的值增加或减少1。返回所有可达成数字中的最大值......
  • LeetCode 215. 数组中的第K个最大元素
    小根堆classSolution{public:intfindKthLargest(vector<int>&nums,intk){priority_queue<int,vector<int>,greater<int>>q;for(autox:nums){if(q.size()<k)q.push(x);......
  • #yyds干货盘点# LeetCode程序员面试金典:区域和检索 - 数组不可变
    1.简述:给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含left和right)之间的nums元素的和,其中 left<=right实现NumArray类:NumArray(int[]nums)使用数组nums初始化对象intsumRange(inti,intj)返回数组nums 中索引 left 和 r......
  • LeetCode 207. 课程表
    classSolution{public:boolcanFinish(intn,vector<vector<int>>&pre){if(pre.empty()||pre[0].empty())returntrue;vector<vector<bool>>g(n,vector<bool>(n,false));for(autoq:pre)......
  • LeetCode -- 792. 匹配子序列的单词数
     方法1:利用桶的思想同时匹配所有words中的子串(走路写法)把所有首字母相同的子串放入到一个桶中,然后遍历s,对于首字母为s[i]的单词,若其大小为1则res++,否则删掉s[i],并根据s[i+1]放入新的桶中。c++classSolution{public:intnumMatchingSubseq(strings,vecto......
  • LeetCode 206. 反转链表
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,ListNode*next):val(x),next(next......
  • LeetCode -- 764. 最大加号标志
     利用动态规划的思想,把每个格子上下左右连续的1的个数算出来,再从头到尾遍历一遍即可获得答案。c++classSolution{public:intorderOfLargestPlusSign(intn,vector<vector<int>>&mines){vector<vector<int>>up(n+1,vector<int>(n+1,0));......
  • 做题日记:1881. 插入后的最大值(leetcode)
    题目:给你一个非常大的整数n和一个整数数字x,大整数n 用一个字符串表示。n中每一位数字和数字x都处于闭区间[1,9]中,且n可能表示一个负数。你打算通过在n的十进制表示的任意位置插入x来最大化n的数值​​​​​​。但不能在负号的左边插入x。例如,如......