文章目录
- 题目描述
- 一,解法一
- 二,解法二
- 总结
题目描述
给你一个按 非递减顺序 排序的整数数组 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(nlogn),这种办法方案比较容易想到,但是其时间复杂度比较高。
代码实现:
public static int[] sortedSquares(int[] nums){
for (int i=0;i<nums.length;++i){ //先将每个位置的元素进行平方
nums[i]=nums[i]*nums[i];
}
Arrays.sort(nums); //利用排序算法进行排序
return nums;
}
二,解法二
算法思想:在一个给定的排序好的数组中,如果该数组全部是正数,那么平方后的相对位置还是不变的,如果该数组全部是负数,那么平方后的排序是逆序的,所以说导致该排序好的数组平方后位置变换的原因就是负数,因为越小的负数,其平方后越大,比如-7的平方要大于-4的平方,而正数越大,其平方后的结果也就越大 ,我们可以用两个指针,一个指针指向开始的位置,另一个指针指向数组结束位置,因为如果存在负数,都在数组的开始位置,申请一个与原来数组一样大的新数组,比较两个指针指向元素的平方后的大小关系,哪个更大就将哪个放到新数组的最后位置,然后新数组向前挪动一个位置,一直到两个指针越过对方结束。这样的话其时间复杂度就会降到O(n),大大减少了运营的时间复杂度。
代码实现:
public static int[] sortedSquares(int[] nums) {
int []result=new int[nums.length]; //申请一个和原来数组一样大的新数组
int i=0,j=nums.length-1,k=nums.length-1; i指针指向原来数组的开始位置,j指针指向原来数组的结束位置,k指针指向新数组的结束位置
while(i<=j){ //当i<=j 的时候 //当i,j两个指针还没有相互跨越的时候
if(nums[i]*nums[i]>nums[j]*nums[j]){ //如果i指针指向的元素平方后比j的大
result[k--]=nums[i]*nums[i]; //将i指针的元素平方后放到k指定位置上面 k--
i++;
}else{
result[k--]=nums[j]*nums[j]; //将j指针的元素平方后放到k指定位置上面,k--
j--;
}
}
return result;
}
总结
碰都数组问题,可以考虑申请一个新的数组,完成一系列操作。