当前位置: 首页 > 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 capacity;private int size;private int[] heap;public MinHeap(int capacity) {this.capacity = capacity;this.size = 0;this.heap = new int[capacity + 1];}private int parent(int index) { return index / 2; }private int leftChild(int index) { return index * 2; }private int rightChild(int index) { return index * 2 + 1; }public int peek() {if (size == 0) throw new IllegalStateException();return heap[1];}public void offer(int value) {if (size == capacity) return;heap[++size] = value;siftUp(size);}public int poll() {if (size == 0) throw new IllegalStateException();int min = heap[1];heap[1] = heap[size--];siftDown(1);return min;}private void siftUp(int index) {while (index > 1 && heap[index] < heap[parent(index)]) {swap(index, parent(index));index = parent(index);}} private void siftDown(int index) {while (leftChild(index) <= size) {int minChild = leftChild(index);if (rightChild(index) <= size && heap[rightChild(index)] < heap[minChild])minChild = rightChild(index);if (heap[index] <= heap[minChild]) break;swap(index, minChild);index = minChild;}}private void swap(int i, int j) {int temp = heap[i];heap[i] = heap[j];heap[j] = temp;}}
}

复杂度分析:

  • 时间复杂度: O(nlogk)。
  • 空间复杂度: O(k)。
原文地址:https://blog.csdn.net/qq_45801780/article/details/147166748
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/98161.html

相关文章:

  • matlab与dsp28335联调
  • 数据集 | 沥青路面缺陷目标检测
  • C++学习之金融类安全传输平台项目git
  • 【软考系统架构设计师】信息系统基础知识点
  • 【软考系统架构设计师】软件工程知识点
  • MySQL 面经
  • 08-JVM 面试题-mk
  • UDS名词解释及分析
  • 【软考系统架构设计师】系统配置与性能评价知识点
  • 文件操作和IO - 2
  • 【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)
  • 07-并发线程 面试题-mk
  • ssh 免密登录服务器(vscode +ssh 免密登录)
  • 【高性能缓存Redis_中间件】一、快速上手redis缓存中间件
  • C++基础精讲-02
  • 05-RabbitMQ 面试题-mk
  • 【软考系统架构设计师】信息安全技术基础知识点
  • Skynet入门(二)
  • TDengine 语言连接器(C/C++)
  • Windows系统Python多版本运行解决TensorFlow安装问题(附详细图文)