1. 三指针关键点:
- 原数组中,使用两个指针 i , j i,j i,j, 分别从最左端,和最右端, 往中间开始移动;
- 新开一个数组 r e s u l t result result, k k k 表示其中的指针,从末尾开始移动,
注意, 这里有两个关键点,本质上是同一个问题
- 新数组中的指针 k k k , 为什么是从末尾开始移动的,
- 先确定出的为什么就是原数组中的最大平方数。
2. 为什么先确定出的是原数组中的最大平方数
-
首先因为原数组是有序的, 且只存在三种情况的数组;
全为负数: -6,-5,-4,-3,-2
全为整数: 1,3,4,5,6,7
有负(有零) 有正:-3,-2,0,5,6,7 -
无论哪种情况, 元素的平方值之后, 最大平方值一定出现在两端, 要么最左边,要么最右边。
-
也就是说原数组中,指针从从端测开始往中间移动的过程, 最先确定的是出平方数, 是最大平方数, 而不是先确定出最小平方数, 从而根据这一点, 在新数组中,最大平方数,应该是放在数组末尾的, 所以 k k k 从末尾开始;
3. 具体移动过程
移动的过程中, 必须注意 i i i, j j j 并非是同时移动的, 而是根据情况移动的, 且移动的始终是平方数较大的那个位置:
只有当该位置上数, 被赋值到新数组中后,对应的 i i i 或 j j j 才会移动;
具体来:
- 比较
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;
}