- 所用算法:双指针
- 观察题目的规律,平方之后该数组两边的数大,中间的数小,因此想到双指针,一个指针指向数组的开头,一个指针指向数组的结尾。
- 如果你觉得在原数组上操作会将未遍历的元素覆盖掉,那么一定要开辟一个新的数组,将原数组的值赋给新的数组。
(比如一个数组平方之后的数组是{4,1,0,9,16})因为你不知道下一组的数(比如第一组是4和16,下一组是1和9)中是否有比4大的数,因此不应该更新指向4位置的索引值,也不应该将4装进新数组中。
- 首先来看一个错误的代码:
vector<int> sortedSquares(vector<int>& nums) { int beg=0,end=nums.size()-1; int beg_sqr=nums[beg]*nums[beg],end_sqr=nums[end]*nums[end]; vector<int>vec; if(nums.size()==1) { nums[beg]=beg_sqr; return nums; } while(beg<=end) { if(beg_sqr>=end_sqr) { vec.emplace(vec.begin(), beg_sqr); ++beg; beg_sqr=nums[beg]*nums[beg]; } else { vec.emplace(vec.begin(), end_sqr); --end; end_sqr=nums[end]*nums[end]; } } return vec; }
++beg和--end都可能造成索引的越界,因此吸取到的经验是,一定要将改变索引值的语句放在程序的最后,这样运行到while循环就可以很好的防止越界问题,那么索引值的改变语句放在了程序的最后我又想利用这个索引值该怎么办呢,解决方法就是将利用索引值的语句(也就是那个平方语句)放在程序的开头,这就相当于将while语句插在了两个语句的中间。
- 正确代码
1 vector<int> sortedSquares(vector<int>& nums) { 2 int beg=0,end=nums.size()-1,k=nums.size()-1; 3 vector<int>vec(nums.size());//此处一定要赋值,因为下标不能对空的容器进行任何的操作,最好不要用下标输出空数组的元素,因为可能会出现未知的值 4 while(beg<=end) 5 { 6 if(nums[beg]*nums[beg]>=nums[end]*nums[end]) 7 { 8 vec[k--]=nums[beg]*nums[beg];//这个地方学到了怎么对数组或则容器向前追加,最好不要在这个地方用模板(vec.emplace(vec.begin(), nums[end]*nums[end]);)力扣显示这样做时间复杂度会增加 9 ++beg; 10 } 11 else 12 { 13 vec[k--]=nums[end]*nums[end]; 14 --end; 15 } 16 } 17 return vec; 18 }