题目描述
若存在一个按非递减顺序排列的整数数组 nums,要求返回每个数字的平方组成的新数组(使其仍为非递减顺序)
C 语言具体代码实现
先谈一下作者自己的想法!!!(直接排序)
将数组的每一个数字平方后保存在原位置,然后利用 qsort 函数排序(直接平方后排序)
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *_a, const void *_b){
int *a = (int*)_a;
int *b = (int*)_b;
return *a - *b; // 递增
}
int *sortedSquares(int *nums, int numsSize, int *returnSize){
for(int i = 0; i < numsSize; i++){
nums[i] *= nums[i];
}
*returnSize = numsSize;
qsort(nums, numsSize, sizeof(int), cmp);
return nums;
}
int main(void){
int nums[] = {-6, -3, -1, 2, 5, 9};
int return_size;
int *newnums = sortedSquares(nums, sizeof(nums)/sizeof(nums[0]), &return_size);
// 格式化输出
printf("[");
for(int i = 0; i < return_size; i++){
if(i != return_size-1){
printf("%d,", newnums[i]);
}else{
printf("%d", newnums[i]);
}
}
printf("]");
// [1,4,9,25,36,81]
return 0;
}
再谈一下其它方法:双指针!!!
使用两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入临时数组并移动指针
#include <stdio.h>
#include <stdlib.h>
int *sortedSquares(int *nums, int numsSize, int *returnSize){
for(int i = 0; i < numsSize; i++){
nums[i] *= nums[i];
}
*returnSize = numsSize;
int *ans = (int*)malloc(numsSize*sizeof(int));
for(int i = 0, j = numsSize-1, pos = numsSize-1; i <= j; ){
if(nums[i] > nums[j]){
ans[pos] = nums[i++];
}else{
ans[pos] = nums[j--];
}
pos--;
}
return ans;
}
int main(void){
int nums[] = {-6, -3, -1, 2, 5, 9};
int return_size;
int *newnums = sortedSquares(nums, sizeof(nums)/sizeof(nums[0]), &return_size);
// 格式化输出
printf("[");
for(int i = 0; i < return_size; i++){
if(i != return_size-1){
printf("%d,", newnums[i]);
}else{
printf("%d", newnums[i]);
}
}
printf("]");
// [1,4,9,25,36,81]
return 0;
}