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

二、盛最多水的容器,有效三角形的个数

一、盛最多水的容器

题目:https://leetcode.cn/problems/container-with-most-water/

题目分析

不能倾倒容器就是不能将容器这样放置着去计算容量:

这道题目里容量的计算公式是:长*宽 

长度遵循“短板原则“,即两个垂直线中较短的那根的长度为长,宽为两根垂直线的横坐标之差(垂直线的条数从0开始数

思路讲解

1.暴力枚举

首先想到的是暴力解法

这个方法替大家试过了,超时

知识补充

java中求两个数中较小值:

1.使用 Math.min() 方法(推荐)

Java 的 Math 类提供了 min() 静态方法,可以直接返回两个数中的较小值,支持intlongfloatdouble 等基本数值类型

public class MinExample {public static void main(String[] args) {int a = 10;int b = 20;// 使用 Math.min() 求较小值int min = Math.min(a, b);System.out.println("较小的数是: " + min); // 输出: 10}
}

2.使用三元运算符(条件运算符)

通过 条件 ? 值1 : 值2 的形式,可以简洁地比较两个数

public class TernaryExample {public static void main(String[] args) {int a = 15;int b = 8;// 使用三元运算符求较小值int min = (a < b) ? a : b;System.out.println("较小的数是: " + min); // 输出: 8}
}

2.利用单调性,使用双指针

这个方法是两个指针合伙遍历了一遍数组,所以时间复杂度为o(n)

代码

class Solution {public int maxArea(int[] height) {int right=height.length-1;int left=0;int max=0;//最大值while(left<right){//当它俩相遇或者交换左右位置了,说明整个数组都遍历完了,搭配也搭完了,故循环结束int tmp=Math.min(height[left],height[right])*(right-left);if(height[left]<height[right]){left++;}else{right--;}if(tmp>max){max=tmp;}}return max;}
}

二、有效三角形的个数

题目:https://leetcode.cn/problems/valid-triangle-number/description/

题目分析

组成三角形:任意两边之和大于第三边,但其实只要保证较小的两边之和大于最大的那一边就行了

思路讲解

1.暴力枚举

首先想到的是暴力解法

//伪代码
for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)for(int k=j+1;k<n;k++)check(nums[i],nums[j],nums[k])

首先要有三层循环来搭配,则时间复杂度为o(N^3)

然后用check函数来判断能不能构成三角形

时间复杂度太大可能会超时,故不用这个解法

2.利用单调性,使用双指针

因为判断三角形可以只用保证较小的两边之和大于最大的那一边,所以先对数组进行排序(在暴力解法中,先对数组进行排序在暴力枚举,也有一定的优化效果)

思路总结:1、先固定最大的数

                  2、在最大数的左区间里,使用双指针算法,统计出符合要求的三元组的个数

                  3、将所有的数都作为最大数固定过了,统计就结束了(其实不需要把所有数都固定一遍,因为三元组需要三个数据,所以固定到第三个数时就可以结束了)

时间复杂度:o(n^2)    因为只需要两层循环

代码

class Solution {public int triangleNumber(int[] nums) {//先进行优化--排序Arrays.sort(nums);int num=0;//定义三元组个数int n=nums.length;for(int i=n-1;i>=2;i--){//nums[i]就是固定的最大数int left=0;int right=i-1;//在这里面定义双指针,两个指针才能在第二层循环结束之后重置正确while(right>left){if(nums[left]+nums[right]>nums[i]){num+=right-left;right--;}else{left++;}}}return num;
}/*因为双指针的指向在每次第二层循环结束之后要重置,所以双指针最好不要定义在循环外部//先进行优化--排序Arrays.sort(nums);int max=nums.length-1;//刚开始时最大数的下标int right=nums.length-2;//刚开始时最大数左区间里的最右边的下标int left=0;//刚开始时最大数左区间里的最左边的下标int num=0;//能组成三角形的组数for(int i=max;i>=2;i--){int c=nums[i];int a=nums[left];int b=nums[right];while(right>left){if(a+b>c){num+=right-left;right--;}else{left++;}}}return num;}
*/
}

http://www.dtcms.com/a/467072.html

相关文章:

  • 石家庄网站建设咨询手机微信小程序制作
  • NumPy 迭代数组
  • 郑州有没有厉害的seo顾问谷歌seo收费
  • 弥勒市建设局网站个人网站 模版 后台管理系统
  • 子网站建设方案做一个小说阅读网站怎么做
  • 网站第三方统计工具如何修改网站底部
  • 【论文精读】TextCrafter:复杂视觉场景中多文本精确渲染的革新框架
  • 【每日算法C#】x 的平方根 LeetCode
  • HT513:低成本高适配的 I2S 输入单声道 D 类音频功率放大器深度解析
  • Roo Code常见问题
  • 怎么创建网站 免费的改版百度不收录网站
  • 教育网站官网深圳小程序开发设计
  • win11 hyper-v 搭建集群虚拟机(用于k8s)
  • 不同材质的实验室试管有何优缺点?哪个更适合你的实验?
  • 高州市网站建设如何做自己的小说网站
  • 建设网站注意实现佛山网站建设公司招聘
  • 贵州 做企业网站的流程页面布局在哪里找到
  • Python爬虫绕过网站验证的完整实战框架(专业级·高实用性)
  • 番禺怎样优化网站建设网站开发的项目开发计划
  • 七段 S 曲线速度规划方法
  • 广州正规网站建设哪家好上哪里建设个人网站
  • 做电商需要哪些网站有哪些网页的开发流程
  • UVa 12143 Stopping Doom‘s Day
  • 搭建 Python 开发环境(Python 运行环境、PyCharm 开发工具)
  • 【Unity3D脚本与系统设计8】时间计时器
  • 网站开发实践体会兴义网站建设
  • 网页小游戏的网站网站国外建设
  • 招聘seo专员资阳优化团队信息
  • 无锡营销型网站价格wordpress 搜索用户名
  • 【开题答辩全过程】以 TeamW动漫网站为例,包含答辩的问题和答案