来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array/
题目描述
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
题目分析
本题提供2种方法:
- 先平方,再排序(最常想到的方法)
- 双指针:两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针
代码实现
public class YouXuShuZuPingFang_977 {
public static void main(String[] args) {
YouXuShuZuPingFang_977 youXuShuZuPingFang_977 = new YouXuShuZuPingFang_977();
int[] nums = {-7,-3,2,3,11};
youXuShuZuPingFang_977.sortedSquares1(nums);
youXuShuZuPingFang_977.sortedSquares2(nums);
}
/**
* 方法2:双指针
* 两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针
* <p>
* 时间复杂度:O(n),其中 n 是数组 nums 的长度。
* <p>
* 空间复杂度:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。
*
* @param nums
* @return
*/
public int[] sortedSquares2(int[] nums) {
int length = nums.length;
int[] ans = new int[length];
// ans 的下标
int index = length - 1;
for (int i = 0, j = length - 1; i <= j; ) {
int pfi = nums[i] * nums[i];
int pfj = nums[j] * nums[j];
if (pfi > pfj) {
ans[index] = pfi;
I++;
} else {
ans[index] = pfj;
j--;
}
index--;
}
System.out.println("方法2:双指针,指向位置 0 和 n−1");
for (int num : ans) {
System.out.println(num);
}
return ans;
}
/**
* 方法1:先平方,再排序
* <p>
* 时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。
* <p>
* 空间复杂度:O(logn)。除了存储答案的数组以外,我们需要 O(logn) 的栈空间进行排序。
*
* @param nums
* @return
*/
public int[] sortedSquares1(int[] nums) {
int[] ans = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
ans[i] = nums[i] * nums[i];
}
Arrays.sort(ans);
System.out.println("方法1:先平方,再排序");
for (int num : ans) {
System.out.println(num);
}
return ans;
}
}
运行结果:
方法一复杂度(先平方再排序)
- 时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。
- 空间复杂度:O(logn)。除了存储答案的数组以外,我们需要 O(logn) 的栈空间进行排序。
方法二复杂度(双指针)
- 时间复杂度:O(n)
- 空间复杂度:O(1)。除了存储答案的数组以外,只需要维护常量空间。
好了,今天就到这里,感谢各位看官到这里,不如点个关注吧!