当前位置:网站首页>997、有序数组的平方(数组)
997、有序数组的平方(数组)
2022-04-23 10:12:00 【Popuessing's Jersey】
题目:
给你一个按 非递减顺序 排序的整数数组 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]
方法一:暴力解法
import java.util.Arrays;
public class Youxushuzupingfang {
public int[] sortedSquares(int [] nums){
for (int i = 0; i <nums.length ; i++) {
nums[i]*=nums[i];
}
//快排
Arrays.sort(nums);
return nums;
}
public static void main(String[] args) {
int [] nums = {-7,-3,2,3,11};
Youxushuzupingfang youxushuzupingfang = new Youxushuzupingfang();
int [] res =youxushuzupingfang.sortedSquares(nums);
for (int x:res) {
System.out.print(x+" ");
}
}
}
时间复杂度:O(n+nlogn):其中n是第一个for循环平方产生的,nlogn是快速排序产生的
空间复杂度:O(logn)
输出结果:
4 9 9 49 121
方法二:双指针法
平方的最大值只可能产生于数组的两端,不可能出现在数组中间,因此可以使用双指针法,分别指向数组的左右两端,比较指针指向的数平方的大小。
public int[] sortedSquares(int [] nums){
int n = nums.length;
//创建一个新的数组保存平方后的值
int [] temp = new int [n];
//设置左右指针
for (int i=0,j=n-1,k=n-1; k>=0 ;k--) {
if(nums[i]*nums[i]>nums[j]*nums[j]){
temp[k] = nums[i]*nums[i];
i++;
}else if(nums[i]*nums[i]<nums[j]*nums[j]){
temp[k] = nums[j]*nums[j];
j--;
}else {//i,j指向的元素平方后的值相等
temp[k] = nums[i]*nums[i];
}
}
return temp;
}
public static void main(String[] args) {
int [] nums = {-7,-3,2,3,11};
Youxushuzupingfang youxushuzupingfang = new Youxushuzupingfang();
int [] res =youxushuzupingfang.sortedSquares(nums);
for (int x:res) {
System.out.print(x+" ");
}
}
时间复杂度:O(n)
空间复杂度:O(n)
其他版本的双指针解法:对比上面的代码,值得我改进的地方有,使用while循环不需要判断循环次数,左右指针使用left,right表述更加直观
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length - 1;
int left = 0;
int[] result = new int[nums.length];
int index = result.length - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
result[index--] = nums[left] * nums[left];
++left;
} else {
result[index--] = nums[right] * nums[right];
--right;
}
}
return result;
}
}
版权声明
本文为[Popuessing's Jersey]所创,转载请带上原文链接,感谢
https://blog.csdn.net/CoCo629vanilla/article/details/121365383
边栏推荐
猜你喜欢
[untitled]
Redis design and Implementation
ARM调试(1):两种在keil中实现printf重定向到串口的方法
解决VMware卸载后再安装出现的问题
Comparative analysis of meta universe from the dimension of knowledge dissemination
net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
MapReduce核心和基础Demo
Depth selector
Question bank and answers of Shanghai safety officer C certificate examination in 2022
Windows安装redis并将redis设置成服务开机自启
随机推荐
Using multithreading to output abc10 times in sequence
Realizing data value through streaming data integration (5) - flow analysis
Realize data value through streaming data integration (2)
Using idea to develop Spark Program
中职网络安全2022国赛之CVE-2019-0708漏洞利用
【无标题】
MapReduce压缩
2022年制冷与空调设备运行操作考试练习题及模拟考试
正大国际讲解道琼斯工业指数到底是什么?
一文看懂 LSTM(Long Short-Term Memory)
计算机网络安全实验二|DNS协议漏洞利用实验
雨生百谷,万物生长
一文读懂PlatoFarm新经济模型以及生态进展
Formattime timestamp format conversion
DBA常用SQL语句(2)— SGA和PGA
Sim Api User Guide(4)
二叉树的构建和遍历
JVM——》常用参数
通过流式数据集成实现数据价值(3)- 实时持续数据收集
Odoo server setup notes