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

题目描述

若存在一个按非递减顺序排列的整数数组 nums,要求返回每个数字的平方组成的新数组(使其仍为非递减顺序

C 语言具体代码实现

先谈一下作者自己的想法!!!(直接排序

        将数组的每一个数字平方后保存在原位置,然后利用 qsort 函数排序(直接平方后排序)

#include  
#include  

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  
#include  

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;
}

你可能感兴趣的:(LeetCode,力扣,算法,有序数组,平方)