题目描述: 给你一个按 非递减顺序 排序的整数数组 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]
来源: 力扣(LeetCode)
链接: https://leetcode-cn.com/problems/squares-of-a-sorted-array/
解决方案:
方法1:暴力破解法,数组中的每个元素平方之后,直接调用库函数sort对数组排序,时间复杂度为O(N+logN).
// 法一:暴力破解法
public static int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums, 0, nums.length);
return nums;
}
方法2:双指针法,首先,重新创建一个新的数组int][] result = new int[nums.length]
,并设置一个游标初始为int k = nums.length - 1
,result
用来存放原来数组元素平方后的排序结果; 之后, 再设置两个指针 i, j,分别从下标0和下标nums.length-1开始对比nums[i] * nums[i]
和nums[j] * nums[j]
的大小,如果nums[i] * nums[i] < nums[j] * nums[j]
, 则 result[k--] = nums[j] * nums[j]
,否则的话 result[k--] = nums[j] * nums[j]
,最后的时间复杂度为O(N).
// 法二:双指针法
public static int[] sortedSquares(int[] nums) {
int i = 0, j = nums.length - 1, k = nums.length - 1;
int[] result = new int[nums.length];
while (i <= j) {
if (nums[i] * nums[i] < nums[j] * nums[j]) {
result[k--] = nums[j] * nums[j];
j--;
} else if (nums[i] * nums[i] >= nums[j] * nums[j]) {
result[k--] = nums[i] * nums[i];
i++;
}
}
return result;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/5243.html