Leetcode 218. The Skyline Problem

本文介绍了一道复杂的算法题——城市天际线问题的解决方案。通过定义自定义的数据结构Point并实现比较方法,利用优先队列进行高度排序,最终得出城市天际线的变化点。文章提供了一个详细的步骤指南,帮助读者理解并解决该问题。

在这里插入图片描述
方法1: 这道题目目前是超过了我的能力范围的,不论是在数据结构的使用还是逻辑的理解上来说都是比较难的。这边我建议复盘的时候看这个视频,讲得很清楚,然后看完了,自己写一遍,现在我自己是没去实现的,因为感觉太难了,做了意义不大。然后记得还要去分析复杂度。

class Solution {
    private class Point implements Comparable<Point>{
        private int x;
        private int height;
        private boolean isStart;
        
        public Point(int x, int height, boolean isStart) {
            this.x = x;
            this.height = height;
            this.isStart = isStart;
        }
        
        // 比较规则复杂,主要是考虑到了三种边界情况
        public int compareTo(Point p) {
            if (this.x != p.x) {
                return this.x - p.x;
            } else {
                if (this.isStart && p.isStart) {
                    return p.height - this.height;
                } 
                if (!this.isStart && !p.isStart) {
                    return this.height - p.height;
                }
                return this.isStart?-1:1;
            }
        }
        
    }
    
    public List<List<Integer>> getSkyline(int[][] buildings) {
        int len = buildings.length;
        if (len == 0 || buildings[0].length == 0) {
            return new ArrayList<List<Integer>>();
        }
        // 每栋建筑有两个关键点
        Point[] points = new Point[len * 2];
        int index = 0;
        
        // 初始化所有关键点的数组
        for (int[] building : buildings) {
            int start = building[0];
            int end = building[1];
            int h = building[2];
            points[index++] = new Point(start,h,true);
            points[index++] = new Point(end,h,false);
            
        }
        // 将这些点按照我们希望的顺序排序
        Arrays.sort(points);
        // 用Collections.reverseOrder()来建立大根堆,这样就可以找到当前最高的高度
        PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
        queue.offer(0);
        List<List<Integer>> res = new ArrayList<>();
        
        int prevMaxVal = 0;
        for (Point point : points) {
            if (point.isStart) {
                queue.offer(point.height);
                int curMaxVal = queue.peek();
                // 如果最大值变化了(只能变大),就说明这个点应该被记录
                if (curMaxVal > prevMaxVal) {
                    List<Integer> l = new ArrayList<>();
                    l.add(point.x);
                    l.add(point.height);
                    res.add(l);
                    prevMaxVal = curMaxVal;
                }
                
            } else {
                queue.remove(point.height);
                int curMaxVal = queue.peek();
                // 最大值变化了(只能变小),记录当前点
                if (curMaxVal < prevMaxVal) {
                    List<Integer> l = new ArrayList<>();
                    l.add(point.x);
                    l.add(curMaxVal);
                    res.add(l);
                    prevMaxVal = curMaxVal;
                }
                
            }
        }
        
        return res;
    }

}

总结:

计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略研究(Matlab代码实现)内容概要:本文研究了计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略,并提供了基于Matlab的代码实现。研究聚焦于在高渗透率可再生能源接入背景下,如何协调微电网内部分布式电源、储能系统与大规模电动汽车充电负荷之间的互动关系,通过引入需求侧响应机制,建立多目标优化调度模型,实现系统运行成本最小化、可再生能源消纳最大化以及电网负荷曲线的削峰填谷。文中详细阐述了风电出力不确定性处理、电动汽车集群充放电行为建模、电价型与激励型需求响应机制设计以及优化求解算法的应用。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、微电网、电动汽车等领域技术研发的工程师。; 使用场景及目标:①用于复现相关硕士论文研究成果,深入理解含高比例风电的微电网优化调度建模方法;②为开展电动汽车参与电网互动(V2G)、需求侧响应等课题提供仿真平台和技术参考;③适用于电力系统优化、能源互联网、综合能源系统等相关领域的教学与科研项目开发。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注模型构建逻辑与算法实现细节,同时可参考文档中提及的其他相关案例(如储能优化、负荷预测等),以拓宽研究视野并促进交叉创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值