当前位置: 首页 > news >正文

LeetCode 解题思路 37(Hot 100)

在这里插入图片描述

解题思路:

  1. 初始化: 初始化最大举行 max 和栈 stack。
  2. 左右补零: 考虑柱子递增的边界情况, 初始化填充柱状图 newHeights。
  3. 遍历处理: 对于每一根遍历到的柱子 newHeights[i],若柱子高度小于栈口索引,计算左边最大矩形面积:
  • 右边界索引:i,栈口元素索引:stack.pop(),左边界索引:stack.peek()。
  • 当前宽度:i - left - 1,当前高度:newHeights[mid]。

Java代码:

class Solution {
    int largestRectangleArea(int[] heights) {
        int max = 0;
        Deque<Integer> stack = new LinkedList<Integer>();

        int[] newHeights = new int[heights.length + 2];
        for (int i = 0; i < heights.length; i++)
            newHeights[i + 1] = heights[i];
        newHeights[0] = newHeights[heights.length + 1] = 0;

        for (int i = 0; i < newHeights.length; i++) {
            while (!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]) {
                int right = i;
                int mid = stack.pop();
                if (!stack.isEmpty()) {
                    int left = stack.peek();
                    int w = right - left - 1;
                    int h = newHeights[mid];
                    max = Math.max(max, w * h);
                }
            }
            stack.push(i);
        }

        return max;
    }
}

复杂度分析:

  • 时间复杂度: O(n)。
  • 空间复杂度: O(n)。

在这里插入图片描述

解题思路:

  1. 维护大小为k的最小堆​​: 堆顶始终是当前堆中最小的元素。
  2. 遍历数组:
  • 前 k 个元素直接入堆。
  • 后续元素与堆顶比较,若当前元素更大,则替换堆顶并调整堆,否则跳过。
  1. 最终结果​: 堆顶元素即为第 k 大元素。

Java代码:

class Solution {
    public int findKthLargest(int[] nums, int k) {
        MinHeap minHeap = new MinHeap(k);
        
        for (int num : nums) {
            if (minHeap.size < k) {
                minHeap.offer(num);
            } else if (num > minHeap.peek()) {
                minHeap.poll();
                minHeap.offer(num);
            }
        }
        return minHeap.peek();
    }

    static class MinHeap {
        private int[] heap;
        private int size;
        private int capacity;

        public MinHeap(int capacity) {
            this.capacity = capacity;
            this.size = 0;
            this.heap = new int[capacity + 1];
        }

        private int parent(int i) { return i / 2; }
        private int leftChild(int i) { return 2 * i; }
        private int rightChild(int i) { return 2 * i + 1; }

        public void offer(int val) {
            if (size >= capacity) return;
            size++;
            heap[size] = val;
            siftUp(size);
        }

        public int poll() {
            if (size == 0) throw new IllegalStateException("Heap is empty");
            int min = heap[1];
            heap[1] = heap[size];
            size--;
            siftDown(1);
            return min;
        }

        public int peek() {
            if (size == 0) throw new IllegalStateException("Heap is empty");
            return heap[1];
        }

        private void siftUp(int i) {
            while (i > 1 && heap[i] < heap[parent(i)]) {
                swap(i, parent(i));
                i = parent(i);
            }
        }

        private void siftDown(int i) {
            while (leftChild(i) <= size) {
                int minChild = leftChild(i);
                if (rightChild(i) <= size && heap[rightChild(i)] < heap[minChild]) {
                    minChild = rightChild(i);
                }
                if (heap[i] <= heap[minChild]) break;
                swap(i, minChild);
                i = minChild;
            }
        }

        private void swap(int i, int j) {
            int temp = heap[i];
            heap[i] = heap[j];
            heap[j] = temp;
        }
    }
}

复杂度分析:

  • 时间复杂度: O(nlogk)。
  • 空间复杂度: O(k)。

相关文章:

  • #MES系统运维问题分析思路
  • leaflet 之 获取中国某个行政区的经纬度边界(latLngBounds)
  • HBuilderX 开发的uniapp项目在微信开发者工具中调试运行
  • 问题 | 对于初学者来说,esp32和stm32哪个比较适合?
  • 【差分隐私相关概念】基础合成定理和高级合成技术简单关系
  • TASKING LSL EXAMPLE FOR TRICORE TC397XP
  • Linux: 进程认识(组织进程)
  • rapidocr 2.0 在线demo来了
  • 罗德与施瓦茨FSH3手持式频谱分析仪FSH8
  • 一致性哈希+虚拟节点 布隆过滤器
  • 【JVM】运行时数据区域
  • Linux:进程理解1(查看进程,创造进程,进程状态)
  • 【区块链安全 | 第四十篇】合约审计之delegatecall(二)
  • jquery.uploadifive.js上传文件 请求标头中添加参数
  • 数据结构(JAVA)队列
  • 使用Vscode排除一些子文件搜索
  • 掌握 Git 的十大基础命令
  • 五分钟了解智能体
  • node从14升级到22,vue2项目调整内容
  • EtherCAT从站错误0x001D调试指南
  • ebay网站做外贸优缺点/搜索引擎排名优化seo课后题
  • 视频wordpress源码/seo如何优化图片
  • java jsp做网站/国外seo网站
  • 企业网站建设上市公司/站长网站工具
  • 家具建设企业网站/宁波seo服务
  • 模版网站怎么做/事件营销的案例有哪些