[toc] leetcode 977. 有序数组的平方
题目描述
- 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 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) 的算法解决本问题
解题思路
法1
排序
-
计算平方
-
数组排序
- 时间复杂度(O(nlogn))
- 空间复杂度(O(1))
方法2
首先创建一个与输入数组 nums 相同长度的结果数组 result。
然后使用双指针方法,分别从数组的最左边和最右边开始遍历。
在每一步迭代中,比较左指针和右指针所指向的元素的平方值的大小,将较大的平方值放入结果数组的末尾,然后相应地移动左指针或右指针。
最后返回结果数组 result。
- 时间复杂度(O(n))
- 空间复杂度(O(n))
执行结果
方法1
func sortedSquares(nums []int) []int {
for i := 0; i < len(nums); i++ {
nums[i]*=nums[i]
}
sort.Ints(nums)
return nums
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 32 ms , 在所有 Go 提交中击败了 30.29% 的用户 内存消耗: 6.6 MB , 在所有 Go 提交中击败了 94.16% 的用户 通过测试用例: 137 / 137 炫耀一下:
法2
func sortedSquares(nums []int) []int {
n := len(nums)
result := make([]int, n)
left, right := 0, n-1
for i := n - 1; i >= 0; i-- {
if abs(nums[left]) > abs(nums[right]) {
result[i] = nums[left] * nums[left]
left++
} else {
result[i] = nums[right] * nums[right]
right--
}
}
return result
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 24 ms , 在所有 Go 提交中击败了 85.44% 的用户 内存消耗: 6.7 MB , 在所有 Go 提交中击败了 70.10% 的用户 通过测试用例: 137 / 137 炫耀一下:
本文由mdnice多平台发布