977.有序数组的平方

写法1

.class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        int k = A.size() - 1;
        vector<int> result(A.size(), 0);
        for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素
            if (A[i] * A[i] < A[j] * A[j])  {
                result[k--] = A[j] * A[j];
                j--;
            }
            else {
                result[k--] = A[i] * A[i];
                i++;
            }
        }
        return result;
    }
};

1.               

在C++中,使用`vector<int> result(A.size(), 0);`初始化一个大小与输入数组`A`相同且所有元素都是0的数组`result`,这样做有几个理由:
1. **安全性**:通过初始化为0,可以确保数组中的每个位置在未赋值前都有一个已知的值。这样可以避免使用未初始化的变量,这可能导致不确定的行为或程序错误。
2. **简化代码**:初始化为0后,在后续的代码中,你不需要担心数组中的元素是否有默认值。这样,当你处理数组时,你可以假设所有位置都已经有一个定义好的值。
3. **可读性**:初始化所有元素为0,可以让阅读代码的人更容易理解数组在使用之前的状态。这增加了代码的可读性和可维护性。
4. **一致性**:如果你需要数组中的所有元素都有相同的初始值,那么初始化所有元素为0可以确保这一点。在某些算法中,一个已知的初始值是必须的。
然而,确实,如果你只是想要一个具有特定大小的数组,而不关心初始值,那么你可以只指定大小而不指定初始值,例如:
```cpp
vector<int> result(A.size());
```
2.       

  在这种情况下,默认构造的`int`类型元素将会被初始化为0(或者对于`int`类型来说,通常是0)。这是因为C++保证未初始化的栈内存不会包含垃圾值,但具体值是未定义的。为了代码的明确性和可移植性,显式初始化通常是一个好的实践。在某些情况下,如果内存优化是首要考虑的,并且你知道代码逻辑不会依赖于初始值,那么可以省略初始值。但是,大多数情况下,显式初始化是一个安全且推荐的做法。
在代码中,`int k = A.size() - 1;` 这一行初始化了一个变量`k`,其值是数组`A`的大小减去1。这样做的原因是数组索引是从0开始的。因此,对于一个大小为`n`的数组,最后一个元素的索引是`n - 
具体到这段代码,这里使用`k`作为结果数组`result`的索引,从后往前填充。以下是为什么需要减去1的几个理由:
1. **数组索引**:在C++中,数组的第一个元素的索引是0,最后一个元素的索引是`size - 1`。因此,如果我们想要从数组的最后一个位置开始填充,我们需要使用`size - 1`作为初始索引。
2. **逆序填充**:这个算法的目标是将每个元素的平方放入结果数组中,并且保持排序。为了做到这一点,算法选择最大的平方值放入结果数组的最后一个位置,然后是次大的,依此类推。因此,从结果数组的最后一个位置开始填充是必要的。
3. **避免越界**:如果我们直接使用`A.size()`作为索引,那么在第一次尝试访问`result`数组时就会越界,因为最大的合法索引是`A.size() - 1`。
所以,`k`初始化为`A.size() - 1`是为了确保我们从结果数组的最后一个元素开始填充,并且在整个过程中不会越界。随着循环的进行,`k`会递减,这样我们就可以按顺序填充数组的前面部分。

3.       

 在代码中,`result[k--] = A[j] * A[j];` 这行代码的作用是将数组`A`中索引`j`位置的元素的平方赋值给结果数组`result`中索引`k`的位置,并且在赋值之后递减`k`的值。
这里使用`k--`而不是单独的`k`或`--k`的原因如下:
1. **赋值后递减**:`result[k--]`表示先使用当前的`k`值作为索引进行赋值操作,然后将`k`的值减1。这确保了赋值操作使用的是当前的`k`值,而在赋值完成后`k`指向数组的下一个可用位置(即前一个元素)。
2. **简洁性**:`k--`在赋值语句中使用,是一种简洁的方式来表示赋值和递减操作同时进行,这样就不需要在代码中再写一个单独的递减语句。
3. **避免混淆**:如果使用`--k`,那么`k`的值会在赋值之前递减,这会导致赋值操作使用的是更新后的`k`值,这可能会导致错误,因为你可能不小心将值赋给了错误的位置。
4. **逻辑一致性**:在这个算法中,`k`是从后向前递减的,因此使用`k--`保持了这个逻辑,即每次处理一个元素后,`k`都会指向结果数组中的下一个位置。
简而言之,`result[k--]`是赋值操作和递减操作的结合,它确保了每次将一个平方值放入结果数组后,`k`都会正确地递减,指向下一个应该被填充的位置。
4.
- `result[k--]`:这里`k--`是后缀递减运算符。这个表达式会先使用`k`的当前值作为索引,完成赋值操作,然后`k`的值会减去1。简而言之,先赋值后递减。
- `result[--k]`:这里`--k`是前缀递减运算符。这个表达式会先将`k`的值减去1,然后用新的(减去后的)`k`值作为索引进行赋值操作。简而言之,先递减后赋值。
因此,根据你的操作需求,你需要选择正确的递减方式。在给定的代码示例中,`result[k--]`正是我们所需要的,因为我们希望在赋值后更新索引`k`。

写法2

class Solution {

public:

    vector<int> sortedSquares(vector<int>& nums)

    {

        vector<int>result(nums.size());

       int k=nums.size()-1;

        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--;

            }

                k--;

        }

        return result;

    }

};

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值