• LeetCode:有序数组的平方


    题目

    给你一个按 非递减顺序 排序的整数数组 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] <= 104
    • nums 已按 非递减顺序 排序

    分析

    这道题我们要抓住一个关键信息,那就是原数组是非递减的, 这样的话该数组平方后的最大值一定在这个数组的第一个或者最后一个元素。找到之后我们就可以将最大的元素放到新数组里面最大的位置上,依次类推。
    这个时候我们就可以考虑使用双指针法了。
    定义一个指针指向数组头元素,再定义一个指针指向数组最后一个元素。如果头元素的平方大于尾元素的平方,将最大值放到新数组最大值的位置上,头指针向前移动一格;反之,尾指针向后退一格。
    代码(C语言):

    int* sortedSquares(int* nums, int numsSize, int* returnSize){
        *returnSize=numsSize;  //新数组大小等于原数组大小
        int left=0,right=numsSize-1; //创建两个指针,right指向数组最后一位元素,left指向数组第一位元素
        int* ret=malloc(sizeof(int)*numsSize); //为新数组分配空间
        int i=numsSize-1;
        for(i=numsSize-1;i>=0;i--){
            if(nums[left]*nums[left]<nums[right]*nums[right]){
            	//若右指针指向元素平方比左指针指向元素平方大,将右指针指向元素平方放入结果数组。右指针左移一位
                ret[i]=nums[right]*nums[right];
                right--;
            }else{
            	//若左指针指向元素平方比右指针指向元素平方大,将左指针指向元素平方放入结果数组。左指针右移一位
                ret[i]=nums[left]*nums[left];
                left++;
            }
        }
        return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    【Java】UWB高精度工业定位系统项目源代码
    MySQL 数据库开发中的 6 个“避免”
    Http协议以及其中的Post、Get等通信模式
    网络安全黑客技术自学
    【华为OD机试真题 python】一种字符串压缩表示的解压 【2022 Q4 | 100分】
    【JAVA】Tomcat的安装
    C#性能优化-树形结构递归优化
    C++——继承
    使用 goland 开发 golang 项目环境配置
    正则表达式基础
  • 原文地址:https://blog.csdn.net/David_house/article/details/132778728