2021-10-23每日刷题打卡

2021-10-23每日刷题打卡

力扣——每日一题

492. 构造矩形

作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:

  1. 你设计的矩形页面必须等于给定的目标面积。

  2. 宽度 W 不应大于长度 L,换言之,要求 L >= W 。

  3. 长度 L 和宽度 W 之间的差距应当尽可能小。
    你需要按顺序输出你设计的页面的长度 L 和宽度 W。

示例:

输入: 4
输出: [2, 2]
解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。
但是根据要求2,[1,4] 不符合要求; 根据要求3,[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2, 宽度 W 为 2。

这题就是说要你找两个最相近的数,这两个数相乘等于它给你的area。要说那两个数最相近而且相乘等于area,那肯定是area的平方根啊,虽然area的平方根不一定是整数,但只要在他们周围找,找到的肯定是差距最小的两个数。准备一个vector容器v来存储结果,先给area开平方,拿一个数num来保存平方根,先判断一下num*num等不等于area本身,如果很幸运相等那就直接把num存入v(要存入两次)。如果不相等就for循环,从num开始循环每次–,循环里那num去除area,把得到的数和num相乘,如果等于area那就把两个数存入v里,然后break结束循环。返回v即可。

class Solution {
public:
    vector<int> constructRectangle(int area) {
        int l=sqrt(area);
        vector<int>v;
        if(l*l==area)
        {
            v.push_back(l);
            v.push_back(l);
        }
        else
        {
            for(int i=l;i>0;i--)
            {
                int w=area/i;
                if(w*i==area)
                {
                    v.push_back(w);
                    v.push_back(i);
                    break;
                }
            }
        }
        return v;
    }
};
977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

两个方法,第一种方法空间用的少但速度慢,第二种空间用的多但速度快。

第一种,遍历一遍nums,每次把nums的位置上的元素平方后在放回去。遍历完后用sort对nums进行排序,返回nums。

class Solution {
public:
     vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0;i<nums.size();i++)
        {
            nums[i]=nums[i]*nums[i];
        }
        sort(nums.begin(),nums.end());
        return nums;
    }
};

第二种,因为一开始给你的nums已经按照升序排序好了,正数的平方不会打乱顺序,但负数的平方会把顺序变成降序,把两边的数分开在重新排序会快很多。准备三个vector容器,一个fu拿来存负数的平方,一个zheng拿来存正数的平方,一个v存结果。遍历一遍nums,把原本是负数的平方放入fu中,正数的平方放入zheng中。创建双指针left=0和right=fu.size()-1,while遍历,当left大于等于zheng.size()或right小于0时结束遍历。每次遍历比较fu[right]和zheng[left],取小的那个放入v中,(如果是fu小则right–,如果是zheng小则left++)如果两个相等就都存入v,然后right–,left++。当遍历完后判断哪个数组里的数没完全插入v中,把剩下的插入v里,最后返回v。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int>fu;
        vector<int>zheng;
        vector<int>v;
        int n=nums.size();
        for(int i=0;i<n;i++)
        {
            if(nums[i]<0)
            {
                fu.push_back(nums[i]*nums[i]);
            }else
            {
                zheng.push_back(nums[i]*nums[i]);
            }
        }
        int left=fu.size()-1,right=0;
        while(left>=0&&right<zheng.size())
        {
            if(fu[left]<zheng[right])
            {
                v.push_back(fu[left]);
                left--;
            }
            else if(fu[left]>zheng[right])
            {
                v.push_back(zheng[right]);
                right++;
            }
            else
            {
                v.push_back(fu[left]);
                left--;
                v.push_back(zheng[right]);
                right++;
            }
        }
        if(left>=0)
        {
            for(int i=left;i>=0;i--)
            {
                 v.push_back(fu[i]);
            }
        }else if(right != zheng.size())
        {
            for(int i=right;i<zheng.size();i++)
            {
                 v.push_back(zheng[i]);
            }
        }
        return v;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值