《数组》学习——有序数组的平方

有序数组的平方

题目

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

测试用例

  • 输入:nums = [-4,-1,0,3,10]
  • 输出:[0,1,9,16,100]
  • 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]

该题,有两种解法:

  • 暴力排序解法
  • 双指针法(快慢指针法)

测试程序:(双指针法的求解)

#include 
#include 
using namespace std;

class Solution
{
public:
	vector sortedSquares(vector & nums)
	{
		int k = nums.size() - 1;  // 结果数组的最后一个位置
		vector result(nums.size(), 0);  // 初始化结果数组
		for(int i=0,j = nums.size() - 1;i <= j;)
		{
			if (nums[i] * nums[i] < nums[j] * nums[j])
			{
				result[k--] = nums[j] * nums[j];  // 右指针的平方较大,放入结果数组
				j--; // 右指针左移
			}
			else
			{
				result[k--] = nums[i] * nums[i];  // 左指针的平方较大或相等,放入结果数组
				i++;  // 左指针右移
			} 
		}
		return result;
	}
};

int main()
{
	Solution solution1;
	vector nums1 = { -4,-1,0,3,10 };
	vector result1 = solution1.sortedSquares(nums1);

	for (int num : result1)
	{
		std::cout << num << " ";
	}
	std::cout << std::endl;
	std::cin.get();
}
//输出:
//0 1 9 16 100

时间复杂度:O(n)

测试程序:(暴力排序的求解)

#include 
#include 
#include  // 包含 sort 函数的头文件
using namespace std;

class Solution
{
public:
	vector sortedSquares(vector& nums)
	{
		for (int i = 0; i < nums.size(); i++)
		{
			nums[i] *= nums[i]; // 对每个元素进行平方,并赋值回数组
		}
		sort(nums.begin(), nums.end()); // 对平方后的数组进行排序
		return nums;
	}
};

int main()
{
	Solution solution1;
	vector nums1 = { -4,-1,0,3,10 };
	vector result1 = solution1.sortedSquares(nums1);

	for (int num : result1)
	{
		std::cout << num << " ";
	}
	std::cout << std::endl;
	std::cin.get();
}
//输出:
//0 1 9 16 100

时间复杂度:O(n + nlogn)

你可能感兴趣的:(我在CSDN学算法,学习)