977.有序数组的平方

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]

方法一:
暴力排序
最直接的方法就是:每个数平方,然后再排序
这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,
但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。

func sortedSquares(nums []int) []int {
	res := make([]int,0)
	for _, num := range nums {
		num = num*num
		res = append(res,num)
	}
	//res = sortArray(res)
	sort.Ints(res)
	return res
}

方法二
双指针
数组其实是有序的, 但是因为有负数,导致平方之后顺序会被打乱
但是有个特点是,数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
那么就可以从两端开始逐步比较,然后从最大的开始排列新数组
这个时间复杂度是 O(n)

func sortedSquares2(nums []int) []int {
	j, s :=len(nums)-1,len(nums)-1
	res := make([]int,len(nums))
	for i:=0;i<=j; {
		if nums[i]*nums[i]>=nums[j]*nums[j] {
			res[s] = nums[i]*nums[i]
			i++
		}else {
			res[s] = nums[j]*nums[j]
			j--
		}
		s--
	}
	return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值