977. 有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/
1.题目
给你一个按 非递减顺序 排序的整数数组 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
已按 非递减顺序 排序
进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
2.题解
题解1:
先把所有的元素平方,然后再使用选择排序算法进行排序(用其他排序算法也可以)。
class Solution {public int[] sortedSquares(int[] nums) {int i,j,min,temp;//1、把所有的元素平方for(i=0; i<nums.length; i++) {nums[i] = nums[i] * nums[i];}//选择排序算法,使元素从小到大排序for(i=0;i<nums.length-1;i++){min=i; // 记录最小值的位置,第一个元素默认最小for(j=i+1;j<nums.length;j++)if(nums[j]<nums[min]) // 找到目前最小值min=j; // 记录最小值的位置if(min!=i) { // 交换两个变量temp=nums[min];nums[min]=nums[i];nums[i]=temp;}}return nums; }
}
注:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
题解2:
使用Arrays.sort()函数。
class Solution {public int[] sortedSquares(int[] nums) {for(int i=0; i<nums.length; i++) {nums[i] = nums[i] * nums[i];}Arrays.sort(nums);return nums; }
}
题解3:
使用双指针。
class Solution {public int[] sortedSquares(int[] nums) {// 创建一个与输入数组相同长度的数组来存储结果int[] result = new int[nums.length];// 初始化变量 i 为数组的起始位置,j 为数组的结束位置,k 为结果数组的最后一个位置int i, j, k = nums.length - 1;// 使用双指针法进行比较,i 从数组开头,j 从数组结尾,k 从结果数组的末尾开始填充for(i = 0, j = nums.length - 1; i <= j; ) {// 比较当前 i 和 j 位置的平方值,较大的平方值放到 result[k] 中if(nums[i] * nums[i] > nums[j] * nums[j]) {// 将 i 位置的平方放入 result[k] 中result[k] = nums[i] * nums[i];// k 递减,准备填充下一个最大值k--;// i 向右移动,继续向右处理i++;} else {// 将 j 位置的平方放入 result[k] 中result[k] = nums[j] * nums[j];// k 递减,准备填充下一个最大值k--;// j 向左移动,继续向左处理j--;}}// 返回结果数组,它已经按升序排列了return result;}
}