对于题目要求,一般思路即是先把数组平方然后进行排序
对于这种思路:
不按照题目要求一般两条路:
第一:先进行平方然后进行排序输出,这种方式,进行第一个平方for循环的话时间复杂度即是o(n),并列进行第二个for循环的话,这个for同上也是o(n),所以便是n*o(n)。
第二:嵌套循环,两层for循环这个只是我想到没有进行实验。
按照题目要求限制时间复杂度为o(n)
首先进行认类和一系列东西
Solution 类
Solution 类是一个用户定义的类,它封装了数据和操作这些数据的函数。在面向对象编程中,类是创建对象的蓝图或模板。Solution 类可能用于表示一个具体的解决方案,比如解决某个算法问题的方法。
Public 关键字
public 是C++中的访问修饰符之一,用于指定类成员(变量和函数)的访问权限。当一个类成员被声明为 public 时,它可以被类的外部代码访问。public 成员提供了类的接口。
引用传递
引用传递是一种参数传递机制,允许函数接收一个变量的别名(引用),而不是变量的副本。这意味着函数内部对引用参数所做的任何修改都会反映到原始变量上。引用传递可以提高程序的效率,因为它避免了复制大型数据结构的开销。
公共成员函数
公共成员函数是类中可以被外部代码访问的函数。它们定义了类的公共接口,允许外部代码与类的对象进行交互。公共成员函数可以访问类的私有(private)和保护(protected)成员,但这些成员不能直接被类的外部代码访问。
第一题思路我看懂了,如果按照不用相对来说比较复杂的或者说是我不熟悉的形式进行表达,我还是有问题,定义数组,我都是按照c的格式,我对老师代码进行逐行分析,理解了数组定义,长度表示。
代码思路,结构完全明白,主要问题是我还没有从c转变过来。所以我要进行区分一下。
这段代码是一个C++类 `Solution` 的定义,其中包含一个成员函数 `sortedSquares`,用于对一个整数向量 `A` 中的每个元素进行平方,并返回一个按非递减顺序排列的平方数向量。下面是逐行解释:
1. `class Solution {`
- 定义了一个名为 `Solution` 的类。
2. `public:`
- 指定了类 `Solution` 的公共访问权限,这意味着类 `Solution` 中 `public` 部分定义的成员函数和变量可以被外部代码访问。
3. `vector<int> sortedSquares(vector<int>& A) {`
- 定义了一个名为 `sortedSquares` 的公共成员函数,它接受一个整数类型的向量 `A` 作为参数,并返回一个整数类型的向量。
- 参数 `A` 使用了引用传递,这意味着函数内部对 `A` 的修改将反映到函数外部。
4. `int k = A.size() - 1;`
- 定义了一个整型变量 `k`,并初始化为向量 `A` 的大小减去1,即 `result` 向量的最后一个索引。
5. `vector<int> result(A.size(), 0);`
- 定义了一个与 `A` 同样大小的整数向量 `result`,并初始化所有元素为0。
6. `for (int i = 0, j = A.size() - 1; i <= j;) {`
- 开始一个 `for` 循环,初始化两个整型变量 `i` 和 `j`。`i` 从0开始,指向向量 `A` 的第一个元素;`j` 从 `A.size() - 1` 开始,指向向量 `A` 的最后一个元素。
- 循环条件是 `i` 小于或等于 `j`,确保当 `i` 和 `j` 相遇时循环结束。
7. `if (A[i] * A[i] < A[j] * A[j]) {`
- 如果向量 `A` 中索引 `i` 处的元素的平方小于索引 `j` 处的元素的平方,则执行以下两个语句。
8. `result[k--] = A[j] * A[j];`
- 将 `A[j]` 的平方赋值给 `result` 向量中索引 `k` 处的元素,然后 `k` 递减,即向 `result` 的前面填充较大的平方数。
9. `j--;`
- `j` 递减,即移动到 `A` 中下一个较小的元素。
10. `else {`
- 如果 `A[i] * A[i]` 不小于 `A[j] * A[j]`,则执行以下两个语句。
11. `result[k--] = A[i] * A[i];`
- 将 `A[i]` 的平方赋值给 `result` 向量中索引 `k` 处的元素,然后 `k` 递减。
12. `i++;`
- `i` 递增,即移动到 `A` 中下一个较大的元素。
13. `}`
- `else` 语句块结束。
14. `}`
- `for` 循环结束。
15. `return result;`
- 返回填充了平方数并按非递减顺序排列的向量 `result`。
16. `}`
- `sortedSquares` 函数结束。
这个函数使用了双指针技术,`i` 从向量 `A` 的开始向后移动,`j` 从 `A` 的末尾向前移动。在每一步中,比较两个指针所指向的元素的平方大小,并将较大的平方数放到 `result` 向量的前面。随着指针的移动,逐渐填充 `result` 向量,直到所有元素都被处理完毕。这种方法的时间复杂度为 O(n),空间复杂度为 O(n),其中 n 是输入向量 `A` 的大小。
红色代表第一次接触但是不明白,绿色代表第一次接触并且明白。
cao服了,看不出来哪出问题了。。。。。
算了先进行第二题
服了,他怎么又对了。。。。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
vector<int> result(nums.size(),0);
for(int i=0,j=k;i<=j;)
{
if(nums[i]*nums[i]<nums[j]*nums[j])
{
result[k--]=nums[j]*nums[j];
j--;
}
else
{
result[k--]=nums[i]*nums[i];
i++;
}
}
return result;
}
};
第二题思路:
按照Carl哥思路写出来了。。
INT32_MAX:
INT32_MAX 是C++标准库中定义的一个宏,它表示一个32位有符号整数(即 int 类型)能表示的最大值。在C++的 <climits> 或 <limits.h> 头文件中定义。
确切的值是 231−1,即 2147483647。这个宏在需要一个整数值来表示一个非常大的数,或者用来初始化一个变量以表示“无限大”或“未找到”等概念时非常有用。
累死了不写了这题