ch1_4 有序数组的平方,三指针移动

lc977, 有序数组的平方

1. 三指针关键点:

  1. 原数组中,使用两个指针 i , j i,j i,j, 分别从最左端,和最右端, 往中间开始移动;
  2. 新开一个数组 r e s u l t result result k k k 表示其中的指针,从末尾开始移动,

注意, 这里有两个关键点,本质上是同一个问题

  1. 新数组中的指针 k k k , 为什么是从末尾开始移动的
  2. 先确定出的为什么就是原数组中的最大平方数

2. 为什么先确定出的是原数组中的最大平方数

  1. 首先因为原数组是有序的, 且只存在三种情况的数组;
    全为负数: -6,-5,-4,-3,-2
    全为整数: 1,3,4,5,6,7
    有负(有零) 有正:-3,-2,0,5,6,7

  2. 无论哪种情况, 元素的平方值之后, 最大平方值一定出现在两端, 要么最左边,要么最右边。

  3. 也就是说原数组中,指针从从端测开始往中间移动的过程, 最先确定的是出平方数, 是最大平方数, 而不是先确定出最小平方数, 从而根据这一点, 在新数组中,最大平方数,应该是放在数组末尾的, 所以 k k k 从末尾开始;

3. 具体移动过程

移动的过程中, 必须注意 i i i, j j j 并非是同时移动的, 而是根据情况移动的, 且移动的始终是平方数较大的那个位置:

只有当该位置上数, 被赋值到新数组中后,对应的 i i i j j j 才会移动;

具体来:

  1. 比较 i i i, j j j 两个位置上的平方数,找出最大平方数,赋值之后,从而确定移动 i i i 还是 j j j
    如果平方后大的数,是在 i i i 位置, 则 i + + i++ i++ , j j j 保持不变;
    如果平方后大的数,是在 j j j 位置, 则 j − − j-- j , i i i 保持不变;

4. vector 作为函数返回值,所应该的注意点

注意有一个问题?

当函数的 返回的vector 是在函数体内创建的局部变量时, 此时如何返回;

5. code

#include <iostream>
#include <vector>
using namespace std;

class Solution{
public:
    vector<int> sortedSquares(vector<int>& A ){
        int i = 0,  j = A.size() - 1;

        vector<int> B(A.size());
        int k = A.size() - 1; //  从末尾开始移动, 因为先确定出的是最大平方数;

        while(i <= j){     // i, j 只有在该位置上的平方数,被赋值到新数组中后, i, 或 j 此时才会移动, 且移动始终是平方数较大的那个位置;
            if (A[i] * A[i] < A[j] * A[j]){
                B[k--] = A[j] * A[j];
                j--;
            }else{
                B[k--] =  A[i] * A[i];
                i++;
            }
        }
        return  B;
    }
};


int main(){

    vector<int>  nums = {-4, -1, 0, 3, 10};

    Solution  obj1;
    vector<int>  result(nums.size());
    result = obj1.sortedSquares(nums);


    for(int i = 0;i <result.size();i++)
    {
        cout<<result[i]<<endl;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值