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

b站推广网站2024不用下载免费网站服务器

b站推广网站2024不用下载,免费网站服务器,wordpress的插件下载地址,黄页网站建设黄页网站建设文章目录 一、问题描述二、暴力法(Brute Force)思路实现代码 三、动态规划法(Dynamic Programming)思路实现代码 四、双指针法(Two Pointers)思路实现代码 五、方法对比 在本文中,我们将探讨经典…

文章目录

    • 一、问题描述
    • 二、暴力法(Brute Force)
      • 思路
      • 实现代码
    • 三、动态规划法(Dynamic Programming)
      • 思路
      • 实现代码
    • 四、双指针法(Two Pointers)
      • 思路
      • 实现代码
    • 五、方法对比

在本文中,我们将探讨经典的接雨水问题,并提供多种解题思路和方法。通过逐步深入的方式,将了解到如何使用暴力法、动态规划法以及双指针法解决这一问题,并对它们进行性能对比。

一、问题描述

42.接雨水
在这里插入图片描述


二、暴力法(Brute Force)

思路

对于数组中的每一个元素,我们都可以找到它左边和右边的最大高度,然后根据这两个最大高度来确定当前元素能够接住的水量。

实现代码

public int trap(int[] height) {int totalWater = 0;for (int i = 1; i < height.length - 1; i++) {int maxLeft = 0, maxRight = 0;// 寻找左边最高的柱子for (int j = i; j >= 0; j--) {maxLeft = Math.max(maxLeft, height[j]);}// 寻找右边最高的柱子for (int j = i; j < height.length; j++) {maxRight = Math.max(maxRight, height[j]);}// 计算当前位置可以存储的水totalWater += Math.min(maxLeft, maxRight) - height[i];}return totalWater;
}

时间复杂度:O(n^2),因为对于每个元素都需要遍历其左右两边来寻找最大值。

空间复杂度:O(1)。


三、动态规划法(Dynamic Programming)

思路

为了避免重复计算每个位置的左右最大高度,我们可以预先计算并存储这些信息。这样,当我们计算某个位置能接多少水时,可以直接查表得到左右最大高度。

实现代码

public int trap(int[] height) {if (height == null || height.length == 0) return 0;int n = height.length;int[] leftMax = new int[n], rightMax = new int[n];// 初始化最左边和最右边的边界条件leftMax[0] = height[0];rightMax[n - 1] = height[n - 1];// 填充leftMax数组for (int i = 1; i < n; i++) {leftMax[i] = Math.max(leftMax[i - 1], height[i]);}// 填充rightMax数组for (int i = n - 2; i >= 0; i--) {rightMax[i] = Math.max(rightMax[i + 1], height[i]);}// 计算总储水量int totalWater = 0;for (int i = 0; i < n; i++) {totalWater += Math.min(leftMax[i], rightMax[i]) - height[i];}return totalWater;
}

时间复杂度:O(n),因为我们只需要遍历数组三次。

空间复杂度:O(n),需要额外的空间来存储左右最大高度。


四、双指针法(Two Pointers)

思路

利用两个指针分别从数组的两端向中间移动,并同时维护左右两侧的最大高度。这种方法可以在一次遍历中解决问题,无需额外的空间。

实现代码

public int trap(int[] height) {if (height == null || height.length == 0) return 0;int left = 0, right = height.length - 1;int maxLeft = 0, maxRight = 0;int totalWater = 0;while (left < right) {if (height[left] < height[right]) {if (height[left] >= maxLeft) {maxLeft = height[left];} else {totalWater += maxLeft - height[left];}left++;} else {if (height[right] >= maxRight) {maxRight = height[right];} else {totalWater += maxRight - height[right];}right--;}}return totalWater;
}

时间复杂度:O(n),只需遍历一次数组。

空间复杂度:O(1),只使用了常数级别的额外空间。


五、方法对比

方法时间复杂度空间复杂度优点缺点
暴力法O(n^2)O(1)易于理解和实现效率低下,不适用于大数据集
动态规划法O(n)O(n)高效处理中等规模数据需要额外的存储空间
双指针法O(n)O(1)最优的时间和空间复杂度理解难度较高

通过上述三种方法的介绍和比较,我们可以看到双指针法以其优秀的时空复杂度成为解决该问题的最佳选择。然而,理解不同的方法有助于我们在面对类似问题时能够灵活运用算法思维,选择最适合当前场景的解决方案。

http://www.dtcms.com/wzjs/90047.html

相关文章:

  • 自己建网站流程要学什么百度认证怎么认证
  • 代购网站怎么做的google ads 推广
  • 网站服务器规划 用户数网站如何做优化排名
  • 做淘宝客怎么建网站站长工具网址是多少
  • 微网站风格焦作网站seo
  • 做旅游网站多少钱怎么自己搭建网站
  • 哪里可以在百度做网站下载班级优化大师app
  • 哪个网站可以做加工代理的站长工具综合查询2020
  • 杭州做网站haomae运用搜索引擎营销的案例
  • 手机游戏的官方网站开发是同步进行的么share群组链接分享
  • 百度做的网站地推团队如何收费
  • expedia电子商务网站建设seo整站优化哪家好
  • 深圳英文网站制作免费放单平台无需垫付
  • 网站程序授权码天津seo排名扣费
  • 百度云 wordpress 教程西安市seo排名按天优化
  • 做百科权威网站有哪些地推平台去哪里找
  • 防城港做网站google浏览器下载
  • 怎么做公司展示网站万网查询
  • 哪个公司制作企业网站子域名查询工具
  • 自己做的电商网站要多少钱网店营销的推广方法有哪些
  • 装饰工程 技术支持 东莞网站建设重大新闻事件2023
  • Adobe Muse 商业网站sem推广竞价托管
  • web网站开发实例友情链接图片
  • 做b站类似的网站成都网站seo
  • 成都网站建设前50强百度问一问付费咨询
  • cms网站内容管理系统个人网站模板免费下载
  • 沧州免费网站建设常德网站建设制作
  • 海口百度seo公司南宁关键词优化服务
  • 福州网站制作官网独立站怎么搭建
  • 厦门手机网站制作seo外链发布平台有哪些