leetcode 977. 有序数组的平方

105 阅读1分钟

[toc] leetcode 977. 有序数组的平方

题目描述

  1. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 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

排序

  1. 计算平方

  2. 数组排序

  • 时间复杂度(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多平台发布