力扣977题(数组)

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

  1. 第一反应的解法就是将原数组平方后再进行排序,但感觉时间复杂度太高了。
  2. 想到的第二个解法是通过对快排算法的改进,快排算法是将所有元素与枢轴元素进行比较,然后每一趟排序都能使得一个元素到达排序后的位置。只需要将比较的元素都用平方后的元素来进行比较,然后元素的移动还是按照原来的元素来,每趟排序的最后一次元素写入用元素的平方进行写入,这样多躺排序下来就能得到平方后的有序数组。
  3. 查看题解用的是双指针法,由于题目给的数组是非递减数组,本来是有序的,因此平方后的数组,大的肯定还是在两边,不可能在中间。因此可以用两个指针,一个指向数组的头部,一个指向数组的尾部,相向而行。每次对指针指向的元素的平方进行比较,将大的那个结果写入新数组的最后一个元素,然后将指向大的数的那个指针往前移动(头指针往后移,尾指针往前移),当两个指针相遇后就结束。显然这个题目用双指针法来会简单的多。
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortedSquares(int* nums, int numsSize, int* returnSize){
    int *res = (int *)malloc(numsSize * sizeof(int));
    *returnSize = numsSize;
    int i,j,k;
    i= 0;
    j = numsSize - 1;
    k = numsSize - 1;
    while (i <= j) {
        if (nums[i] * nums[i] >= nums[j] * nums[j]) {
            res[k--] = nums[i] * nums[i];
            i++;
        }
        else {
            res[k--] = nums[j] * nums[j];
            j--;
        }
    }
    return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值