题目
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,
要求也按 非递减顺序 排序。
示例 1:
输入: nums = [-4,-1,0,3,10]
输出: [0,1,9,16,100]
解释: 平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入: nums = [-7,-3,2,3,11]
输出: [4,9,9,49,121]
提示:
1 <= nums.length <= 104-104 <= nums[i] <= 104nums已按 非递减顺序 排序
思路:
-
凡事都可以通过暴力解决,只不过是费力气,我们先从暴力角度出发,毕竟先完成,再完美嘛,由于数组元素都知道了,于是就可以直接全都平方,然后进行排序,可以冒泡,可以选择,也可以...
-
但是我们肯定还有更加便捷的实现方式,因为我们知道,左右两边只是因为正负导致了大小不同,平方之后两边的数字都站在同一起跑线上了,所以,可以从两边不断向中间靠近,将两边更大的那个排入新数组当中,从而实现新排序数组。
代码实现:
第一种就不实现了,实现第二种
目前因为我考试需要,所以先实现C语言代码,c++代码由我的gemini实现~
#c语言版本
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
*returnSize = numsSize;
int left =0,right = numsSize-1,loc=0;
int leftval,rightval;
int *result = (int*)malloc(sizeof(int)*numsSize);
loc = numsSize-1;
while (left <= right) {
int leftSquare = nums[left] * nums[left]; // 计算左指针元素的平方
int rightSquare = nums[right] * nums[right]; // 计算右指针元素的平方
if (leftSquare > rightSquare) {
result[loc] = leftSquare; // 左平方更大,放入当前位置
left++;
} else {
result[loc] = rightSquare; // 右平方更大,放入当前位置
right--;
}
loc--;
}
return result;
}
#c++版本
#include <vector>
#include <cmath>
class Solution {
public:
std::vector<int> sortedSquares(std::vector<int>& nums) {
int n = nums.size();
// 初始化结果向量,大小与原数组一致
std::vector<int> result(n);
int left = 0;
int right = n - 1;
// 结果数组从后往前填充(先填最大的)
int loc = n - 1;
while (left <= right) {
int leftSquare = nums[left] * nums[left];
int rightSquare = nums[right] * nums[right];
if (leftSquare > rightSquare) {
result[loc] = leftSquare;
left++;
} else {
result[loc] = rightSquare;
right--;
}
loc--;
}
return result;
}
};