leetcode每日一题1725. 可以形成最大正方形的矩形数目 哈希表存储 到 贪心遍历 优化~

📖本篇内容:leetcode每日一题1725. 可以形成最大正方形的矩形数目 哈希表存储 到 贪心遍历 优化

📑 文章专栏:leetcode每日一题《打卡日常》

📆 最近更新:2022年2月3日 1414. 和为 K 的最少斐波那契数字数目 贪心+递归 大年初三力扣是想意思意思一下呗~

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

🙊写在前面🙊

大年初四,被亲戚当成动物园里的动物观摩,阿巴不~这种感觉你绝对想不到,手里那这键盘,一头乱发的小付吃着零食,被亲戚们投喂的感觉,你们知道么!我敢说,绝对是大型社死现场… 还是来刷提吧,消散我这蛋蛋的忧伤!

题目

给你一个数组 rectangles ,其中 rectangles[i] = [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。

如果存在 k 同时满足 k <= li 和 k <= wi ,就可以将第 i 个矩形切成边长为 k 的正方形。例如,矩形 [4,6] 可以切成边长最大为 4 的正方形。

设 maxLen 为可以从矩形数组 rectangles 切分得到的 最大正方形 的边长。

请你统计有多少个矩形能够切出边长为 maxLen 的正方形,并返回矩形 数目 。

示例

示例1:

输入:k = 7
输入:rectangles = [[5,8],[3,9],[5,12],[16,5]]
输出:3
解释:能从每个矩形中切出的最大正方形边长分别是 [5,3,5,5] 。
最大正方形的边长为 5 ,可以由 3 个矩形切分得到。

示例2:

输入:rectangles = [[2,3],[3,7],[4,3],[3,7]]
输出:3

提示

1 <= rectangles.length <= 1000
rectangles[i].length == 2
1 <= li, wi <= 10^9
li != wi

📝思路📝

  • 第一种思路:可以称得上是暴力AC,我们可以维护一个哈希表用于存储每个矩形对应的最大可切割成正方形的边长curMaxLen,同时维护一个全局最大可分割的正方形边长,进行一次遍历即可。
  • 第二种思路:有了上述思路那就容易多了,对于昨天的贪心题,今天又有了用武之地,咱们试着简化上述代码进行遍历求解即可

⭐代码实现⭐

哈希表暴力AC法

class Solution {
    public int countGoodRectangles(int[][] rectangles) {
        Map<Integer,Integer>map = new HashMap<>();
        //初始化当前全局最大可分割正方形的边长
        int maxLen = Math.min(rectangles[0][0],rectangles[0][1]);
        int n = rectangles.length;
        //进行遍历
        for (int i = 0 ;i< n;i++){
        	//计算当前矩形可分割的最大正方形边长
            int curMaxLen = Math.min(rectangles[i][0],rectangles[i][1]);
            //计数
            map.put(curMaxLen,map.getOrDefault(curMaxLen,0)+1);
            //求全局最长
            maxLen = Math.max(maxLen,curMaxLen);
        }
        //返回个数
        return map.get(maxLen);
    }
}

贪心遍历优化

class Solution {
    public int countGoodRectangles(int[][] rectangles) {
    	//用于记录结果
        int count = 0 ;
        //初始化当前全局最大可分割正方形的边长
        int maxLen = Math.min(rectangles[0][0],rectangles[0][1]);
		//遍历
        for (int i = 0 ; i< rectangles.length;i++){
        	//计算当前矩形可分割的最大正方形边长
            int curMaxLen =  Math.min(rectangles[i][0],rectangles[i][1]);
            //如果当前可分割的最大正方形边长比之前全局能分割的最大正方形边长要大的话
            //进行赋值重新计数
            if (curMaxLen > maxLen){
                maxLen = curMaxLen;
                count = 1;
            //如果能再次匹配到全局能切割的最大的正方形边长则数量自增
            }else if (curMaxLen == maxLen)count ++;
        }
        //返回个数
        return count;
    }
}

运行结果

哈希表暴力AC
在这里插入图片描述
贪心遍历优化
在这里插入图片描述

🙊写在最后🙊

2022-2-4今天小付打卡了哦~

今天是大年初四,祝大家幸福美满,欢天喜地~

美好的日出 美好的山河

都因有你存在 而璀璨 耀眼

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值