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]
2.解决方法
2.1暴力排序
最为直接的想法就是将给定数组的每个数都平方,再排序。
# 暴力破解法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
# 通过循环平方数组中的每个元素
for i in range(len(nums)):
nums[i] *= nums[i]
# 调用函数sort()进行排序
nums.sort()
return nums
额外注释:python中的sort()函数,内部实现方式为Timsort算法
Timsort是一种混合的排序算法,它结合了归并排序和插入排序的优点。在Python中,`list.sort()`方法以及内置函数`sorted()`都是使用Timsort作为其排序算法。具体来说,Timsort算法的特点包括:
1. **稳定性**:Timsort是一种稳定的排序算法,这意味着具有相同值的元素在排序后保持它们原始的顺序。
2. **时间复杂度**:最坏情况下的时间复杂度为O(n log n),这是指在需要比较和移动元素的情况下。
3. **空间复杂度**:Timsort的空间复杂度为O(n),这是因为它需要额外的空间来存储临时数据。
4. **适应性**:Timsort能够根据数据的局部特征来选择不同的排序策略,例如,当遇到已经部分排序的数据时,它会采用插入排序,这可以提高排序的效率。
5. **优化**:Timsort包含多种优化策略,比如针对小列表使用插入排序,以及识别已排序的序列来减少不必要的比较和移动操作。
总的来说,Timsort算法的这些特性使得它在实际应用中非常高效,尤其是在处理部分有序或完全有序的数据时。这也是为什么Python选择它作为默认排序算法的原因。
2.2双指针的方法
首先根据题目看出给出的数组是非递减顺序的,反过来说就是递增或者中间存在相等的数据。题目结果要求输出一个平方后的非递减序列。那么,原数组平方之后并且在新数组后面的元素一定是由旧数组两侧的某一个元素平方而来。那么我们就可以这样做,
①设置两个指针指向旧数组的两端,然后比较他们两个平方后数字的大小,
②大的那个插入新数组的末尾,直到左指针的位置超过了右指针的位置,循环结束,得到平方后的数组。
代码:
left_itr = 0 # 左指针
right_itr = len(nums)-1 #右指针
lenth = len(nums)
result = [0]*lenth # 设置一个长度为原数组长度的空数组(初始化为0)
while left_itr <= right_itr:
if nums[left_itr]*nums[left_itr] < nums[right_itr] *nums[right_itr]:
result[lenth-1] = nums[right_itr] *nums[right_itr]
right_itr-=1
lenth-=1
else:
result[lenth-1] = nums[left_itr]*nums[left_itr]
left_itr+=1
lenth-=1
return result
额外注释:如何创建一个已知长度的列表
(1)、使用列表推导式:
fixed_length_list = [0 for _ in range(5)]
(2)、使用乘法操作符
fixed_length_list = [0] * 5
(3)、使用列表的extend方法:
fixed_length_list = []
fixed_length_list.extend([0] * 5)
3.链接
其他语言版本代码:代码随想录