有序数组的平方双指针解决——算法篇章

8 阅读2分钟

题目

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

leetcode链接

示例 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 已按 非递减顺序 排序

思路:

  1. 凡事都可以通过暴力解决,只不过是费力气,我们先从暴力角度出发,毕竟先完成,再完美嘛,由于数组元素都知道了,于是就可以直接全都平方,然后进行排序,可以冒泡,可以选择,也可以...

  2. 但是我们肯定还有更加便捷的实现方式,因为我们知道,左右两边只是因为正负导致了大小不同,平方之后两边的数字都站在同一起跑线上了,所以,可以从两边不断向中间靠近,将两边更大的那个排入新数组当中,从而实现新排序数组。

代码实现:

第一种就不实现了,实现第二种

目前因为我考试需要,所以先实现C语言代码,c++代码由我的gemini实现~

#c语言版本
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
  *returnSize = numsSize;
  int left =0,right = numsSize-1,loc=0;
  int leftval,rightval;

  int *result = (int*)malloc(sizeof(int)*numsSize);
  loc = numsSize-1;
  
  while (left <= right) {
      int leftSquare = nums[left] * nums[left]; // 计算左指针元素的平方
      int rightSquare = nums[right] * nums[right]; // 计算右指针元素的平方
      
      if (leftSquare > rightSquare) {
          result[loc] = leftSquare; // 左平方更大,放入当前位置
          left++;  
      } else {
          result[loc] = rightSquare; // 右平方更大,放入当前位置
          right--;  
      }
      loc--;  
  }
  return result;
  

}
#c++版本
#include <vector>
#include <cmath>

class Solution {
public:
    std::vector<int> sortedSquares(std::vector<int>& nums) {
        int n = nums.size();
        // 初始化结果向量,大小与原数组一致
        std::vector<int> result(n);
        
        int left = 0;
        int right = n - 1;
        // 结果数组从后往前填充(先填最大的)
        int loc = n - 1;

        while (left <= right) {
            int leftSquare = nums[left] * nums[left];
            int rightSquare = nums[right] * nums[right];

            if (leftSquare > rightSquare) {
                result[loc] = leftSquare;
                left++;
            } else {
                result[loc] = rightSquare;
                right--;
            }
            loc--;
        }

        return result;
    }
};