文档讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep
看讲解前状态:不会
看讲解后状态:有思路
二刷状态:
基础知识:
-
vector result(A.size(), 0);
这段代码使用了C++标准库中的 vector 容器,创建一个整数向量 result,该向量的大小与对象 A 中的元素数量相同,每个元素都被初始化为整数值 0。-
vector:这是C++标准库中的容器之一,用于存储一组具有相同类型的元素。在这里,我们使用了 vector 来创建一个存储整数类型的向量。
-
result:这是你所创建的整数向量的名称,你可以根据需要为向量取任何合适的名称。
-
A.size():这是一个名为 A 的对象(可能是一个向量或数组),通过 .size() 成员函数获取了其元素的数量(大小)。
-
0:这是一个初始值,用于初始化 result 中的每个元素。
-
-
这可以用于在后续的代码中存储一些与问题相关的数据,例如计数、累加等。
题目:
https://leetcode.cn/problems/squares-of-a-sorted-array/
法一:暴力排序法
代码实现:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k =nums.size()-1;
vector<int> result(nums.size(),0);//创建一个整数向量result,大小与nums的元素数量相同,每个元素都被初始化为0。
for (int i=0,j=nums.size()-1;i<=j;){
if (nums[i]*nums[i]>nums[j]*nums[j]){
result[k--] = nums[i]*nums[i];
i++;
}
else{
result[k--] = nums[j]*nums[j];
j--;
}
}
return result;
}
};
时间复杂度:O(n + nlogn)
法二:双指针法
解题关键:
- 比较i处J处元素谁大,谁大谁i++,j–,并付给k值
解题思路:
-
题目可看出平方后(大->小<-大),所以可用两个指针操作,逐步由量变向中间合拢,得到一个由大到小的数组(两边比较,覆盖替换),类似于27移除元素中的相向双指针法。
- 由于我们得到的结果是(大->小),而题目要求为(小->大),所以可以吧得到的数组下标反向更新,下标直接由大到小更新。
通过指定数组末元素下标k=nums.size-1,每一步都k–来更新。
- 由于我们得到的结果是(大->小),而题目要求为(小->大),所以可以吧得到的数组下标反向更新,下标直接由大到小更新。
-
for(i=0,j=nums.size - 1;i<=j;) 不是i<j的原因:若i<j,则当i=j时,那个元素就会被落下。
- 此处不写i++,j–,因为需要满足一定条件才进行i++,j–
- 只有I处为最大值才i++,j处为最大值才j–
-
看上去忽略了nums[i]^2与 nums[j]^2相等的情况,但实际上,当他两相等时,通过j、i任意一个更新都一样,另一个值不更新直接参与下一次比较即可。所以直接else。
代码实现:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k =nums.size()-1;
vector<int> result(nums.size(),0);//创建一个整数向量result,大小与nums的元素数量相同,每个元素都被初始化为0。
for (int i=0,j=nums.size()-1;i<=j;){
if (nums[i]*nums[i]>nums[j]*nums[j]){
result[k--] = nums[i]*nums[i];
i++;
}
else{
result[k--] = nums[j]*nums[j];
j--;
}
}
return result;
}
};
时间复杂度:O(n)
☹☹☹遇到的问题:
- vector不熟悉