数组之有序数组的平方

本文旨在对所学做学习巩固,方便然后复习
leetcode本题链接
数组之有序数组的平方_第1张图片
此题要求设计时间复杂度为O(n)的算法

1. 暴力解法

此方法也容易通俗理解:就是将数组里面的元素全部平方,然后用sort(A.begin(), A.end())方法排序。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++)
        {
        	nums[i] *= nums[i];
        }
        sort(nums.begin(), nums.end());
        return nums;
    }
};

这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度

2. 双指针法

如果把数组里面的元素全部平方,有序数组,两头大,中间小。可以利用双指针的方法。

首先,建立一个新数组
其次,利用for循环建立两个指针,一尾一末
比较两个指针所指的元素平方的大小,大的存放到新数组里

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(), 0); // 存放有序数组的数组
        int k = nums.size() - 1; //因为从大到小存进新数组,为了最后形成非递减数组,就从先存下标大的元素
        for (int i = 0, j = k; i <= j;)
        {
        	if (nums[i] * nums[i] > nums[j] * nums[j])
        	{
        		result[k--] = nums[i] * nums[i];
        		i++; // 指针1往右移
        	}
        	else
        	{
        		result[k--] = nums[j] * nums[j];
        		j--; // 指针2往左移
        	}
        }
        return result;
    }
};
 for (int i = 0, j = k; i <= j;)

Tip:
数组之有序数组的平方_第2张图片
为什么要i<=j,因为当i=j的时候,要把这个2放到result数组里,如果i


#########################################################################################
################################不积跬步,无以至千里#######################################
#########################################################################################

你可能感兴趣的:(力扣刷题,学习,c++,数据结构)