《力扣刷题》 有序数组的平方

题目描述

若存在一个按非递减顺序排列的整数数组 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我来晚了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值