有序数组的平方(双指针思路+代码实现)

题目

在这里插入图片描述

①排序思路

1.对于无规律序列:

可以使用 -> 快速排序(sort函数),冒泡排序。
快排(快速排序)时间复杂度更低(NlogN),而且C++有相应的函数sort
所以更加用快速排序。

2.对于有规律序列:

通过观察 and 积累经验,能够做到效率更高的决策,本题也是有规律的!

②本题排序思路

思路:本题应该对原数组平方,然后对原数组进行排序

具体排序思路:本题是有序数组,平方后的最大值可能第一个元素,也可能是最后一个元素,换句话说"最大值恒存在数组的两端"

例如:(-10)*(-10)>5*5。
其实也可以看作绝对值进行排序,然后全部平方
(但本题绝对值排序完再平方其实会比较复杂,提出绝对值只是辅助理解)

③双指针实现排序思路

补充:这里指针不是指针类型,而是游标指针

补充:slow和fast是同起点出发,fast指针走的比slow快,本题的left和
right指针是从数组的左右两端出发的。都是双指针,只是表示形式有点不同

Ⅰ:双指针left和right的含义

1.left、right整体的意义:

闭区间[left,right]是原数组未比较过的元素的下标区间,可视作"新数组"

2.left的意义:

"新数组"的第一个元素(可能是负值,可能平方后是最大值)

3.right的意义:

"新数组"的最后元素(原数组是升序,所以可能平方后是最大值)

Ⅱ:双指针具体实现思路

1.最大值恒存在"新数组"的两端

left、right双指针就指向了新数组的两端。
对比nums[left]、nums[right]可得到最大值

	根据双指针left、right的含义可知:
	1.nums[left]是最大值,left需要右移

	2.nums[right]是最大值,right需要左移

2.需要辅助数组存储最大值

本题就无法直接操作原数组,必须借助辅助数组

将对比得到的每个最大值,放入辅助数组里

④具体代码实现

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums)
    {
        //辅助数组存储最大值
        int k=nums.size()-1;
    	vector<int>ret(nums.size());

        //先对原数组平方
    	for(int i = 0;i<nums.size();i++){
    		nums[i]=nums[i]*nums[i];
		}
		
		
		int slow = 0;
		int fast = nums.size()-1;
		
		while(slow<=fast){
			if(nums[slow]<=nums[fast]){
				ret[k--]=nums[fast--];
			}
			else{
				ret[k--]=nums[slow++];
			}
		}
		
		return ret;
    }
};
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值