题解 | #火柴拼图#

火柴拼图

http://www.nowcoder.com/practice/df40b15331ea47ea85b0127b9cdc4502

题意

有n根火柴,可以用其中长度相同的火柴拼成正方形或正三角形,求能拼成的最大面积。

100分做法:暴力枚举

对于每一种不同长度的火柴,枚举组成正方形和三角形的个数,并计算最大面积。

class Solution {
public:
    
    void calc(int l,int t,vector<long> &ans)
    {
        int Sqa=0;
        int Tri=0;
        const double a=sqrt(3)/4;
        double maxx=0.0;
        int maxSqa=0;
        int maxTri=0;//存贮组成最大面积时的三角形和正方形个数
        for(Sqa=0;Sqa<=t/4;Sqa++) {
          Tri=(t-4*Sqa)/3;
          double tmp=a*Tri+Sqa;
          if(tmp>maxx)
          {
            maxx=tmp;
            maxSqa=Sqa;
            maxTri=Tri;
           }
        }
        ans[1]+=(maxSqa*l*l);
        ans[0]+=(maxTri*l*l);//存储答案
    }
    vector<long> MaxArea(int n, vector<int>& Stick)
    {
        vector<long> ans(2,0);//答案数组
        vector<int> stick(100005,0);//stick[Len]=Num表示长度为Len的火柴有Num根
        sort(Stick.begin(),Stick.end());
        for(int i=0;i<n;i++) stick[Stick[i]]++;//预处理stick
        for(int i=0;i<=Stick[n-1];i++) 
            calc(i,stick[i],ans);//对于每一种火柴,计算其能组成的最大面积
            return ans; 
    }
};

时间复杂度:O(nmaxStickLength+nlogn)O(n*maxStickLength+nlogn)O(nmaxStickLength+nlogn),其中maxStickLengthmaxStickLengthmaxStickLength是最长木棍的长度,对于不同的长度,需要执行n/4次计算,与排序的时间相加就是时间复杂度。

空间复杂度:O(n)O(n)O(n),过程中使用的stickstickstick数组占用的空间为O(n)O(n)O(n)

100分做法:贪心

贪心思路,有火柴时先组成正方形,剩下的火柴组成正三角形,这个贪心的证明是显然的,过程如下。 alt 故有6根火柴时组成一个正方形比两个三角形更好,因此我们的贪心策略是正确的。(图片只为直观展示三角形面积和正方形面积关系。)

class Solution {
public:
    
    void calc(int l,int t,vector<long> &ans)
    {
        int Sqa=t/4;//根据贪心,尽量要多组成正方形
        int Tri=(t%4==3)?1:0;//如果还有多余的三根木棍可以组成三角形
        ans[1]+=(Sqa*l*l);
        ans[0]+=(Tri*l*l);
    }
    vector<long> MaxArea(int n, vector<int>& Stick)
    {
        vector<long> ans(2,0);//答案数组
        vector<int> stick(100005,0);//stick[Len]=Num表示长度为Len的火柴有Num根
        sort(Stick.begin(),Stick.end());
        for(int i=0;i<n;i++) stick[Stick[i]]++;//预处理stick
        for(int i=0;i<=Stick[n-1];i++) 
            calc(i,stick[i],ans);//对于每一种火柴,计算其能组成的最大面积
            return ans; 
    }
};

时间复杂度:O(maxStickLength+nlogn)O(maxStickLength+nlogn)O(maxStickLength+nlogn),其中maxStickLengthmaxStickLengthmaxStickLength是最长木棍的长度,运用贪心,每个长度只需要常数基本时间,再与排序所用的时间相加。

空间复杂度:O(n)O(n)O(n),过程中使用的stickstickstick数组占用的空间为O(n)O(n)O(n)

全部评论

相关推荐

头像
03-03 15:53
已编辑
黑龙江大学 Java
在当前开源项目极为丰富的背景下,付费资源并不一定意味着最前沿的技术优势,在具体执行层面展示出自己的独特价值,才是简历上最重要的加分项。1.&nbsp;WebMCP&nbsp;—&nbsp;让网站主动告诉&nbsp;AI&nbsp;该怎么操作AI&nbsp;操作浏览器的方案一直靠&quot;猜&quot;——截图识别、DOM&nbsp;解析,错误率&nbsp;15-30%。WebMCP&nbsp;反过来,让网站自己声明能做什么,AI&nbsp;直接调用结构化接口,准确率接近&nbsp;100%。Chrome&nbsp;Canary&nbsp;已实装。企业内部系统的&nbsp;WebMCP&nbsp;适配目前几乎没人做,是明确的蓝海。推荐理由:简历上写的不是&quot;我会用某个框架&quot;,而是&quot;我在标准刚发布时就做了企业适配&...
书海为家:#人脑vsAI# 尽管深度学习的最初灵感来源于人类的大脑,但二者的运作方式截然不同:深度学习所需要的数据量远比人脑所需要的多得多。可是一旦经过大数据训练,它在相同领域的表现将远远超过人类(尤其是在数字的量化学习,例如挑选某人最可能购买的产品,或从100万张脸中挑选最匹配的一张)——相对来说,人类在同一时间内只能把注意力放在少数几件事情上面,而深度学习算法却可以同时处理海量信息,并且发现在大量数据背后的模糊特征之间的关联,这些模糊特征不仅复杂而且微妙,人类往往无法理解,甚至可能不会注意到。 虽然深度学习拥有人类所缺乏的并行处理海量数据的“绝技”,但不具备人类在面对决策时独一无二的汲取过去的经验、使用抽象概念和常识的能力。 与人类相比,深度学习想要充分发挥作用,离不开海量的相关数据、单一领域的应用场景以及明确的目标函数,这三项缺一不可,如果缺少其中任何一项,深度学习将无用武之地。
AI求职实录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务