2021-10-23每日刷题打卡
力扣——每日一题
492. 构造矩形
作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:
-
你设计的矩形页面必须等于给定的目标面积。
-
宽度 W 不应大于长度 L,换言之,要求 L >= W 。
-
长度 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;
}
};