977.有序数组的平方——学习笔记

题目:给你一个按非递减顺序排序的整数数组 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 已按 非递减顺序 排序

题目来源:力扣(LeetCode)链接

题解

class Solution {
    public int[] sortedSquares(int[] nums) {
        int len = nums.length; //记录数组的长度
        int negative = -1; //存放数组的最后一个负数的下标
        //遍历数组找到最后一个负数,把下标赋给nagetive
        for (int i = 0; i < len; i++) {
            if (nums[i] < 0) {
                negative = i;
            } else {
                break;
            }
        }
        int resArr[] = new int[len];//定义一个新数组,用来存放结果
        int index = 0;//定义index为resArr数组的下标
        int left = negative;//把数组分为负数和非负数两部分
        int right = negative + 1;
        while (left >= 0 || right <len) {
            if (left < 0) {//说明数组中没有负数或者比较完之后只有右边还有值
                resArr[index] = nums[right] * nums[right];
                right++;
            } else if (right == len) {//说明数组中没有非负数或者比较完之后只有左边还有值
                resArr[index] = nums[left] * nums[left];
                left--;
            } else if (nums[left] * nums[left] > nums[right] * nums[right]) {//把较小的值放在resArr数组的前面
                resArr[index] = nums[right] * nums[right];
                right++;
            } else {
                resArr[index] = nums[left] * nums[left];
                left--;
            }
            //每次循环resArr数组的下标都要后移
            index++;
        }
        //把得到的结果返回
        return resArr;
    }
}
posted @ 2023-03-20 21:17  会飞的笨笨  阅读(15)  评论(0)    收藏  举报