977. 有序数组的平方
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
tem = [i**2 for i in nums]
result = sorted(tem)
return(result)
双指针
从两边到中间
两边到中间的话,不用像从中间到两边那样考虑边界的情况,所以代码看起来简洁很多
class Solution(object):
def sortedSquares(self, nums):
n = len(nums)
i, j, pos = 0, n - 1, n - 1 #i为左指针,j为右指针
result = [0]*n #创建一个临时的数组,这里不能创建一个空数组,因为这里的双指针是从两边到中间的,两边的数字平方肯定是大数,所以不能通过空数组append的形式往里面加
if n < 0:
return([]) #如果nums为空,返回空数组
while i<=j:
if nums[i]**2 < nums[j]**2: #nums[i]**2 小,把j放进result,移动右边的指针
result[pos] = nums[j]**2
j-=1
pos-=1
else:
result[pos] = nums[i]**2: #移动左边的指针
i+=1
pos-=1
return(result)
从中间向两边
中间向两边的情况,要考虑边界的情况,具体看代码及代码注释
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
#双指针
dif = -1
for i,num in enumerate(nums): #这个循环用来确定负数和正数的分界
if nums[i] < 0:
dif = i
else:
break
result = [] #用于存放结果
n = len(nums)
i, j = dif, dif + 1 #2个指针的位置
while i > -1 or j < n:
if i < 0: #判定左边界是否超出
result.append(nums[j]**2)
j += 1
elif j == n: #判定右边界是否超出
result.append(nums[i]**2)
i -= 1
elif nums[i]**2 < nums[j]**2:
result.append(nums[i]**2)
i -= 1
else:
result.append(nums[j]**2)
j += 1
return(result)
代码上,必须要先判定是否在左边界和右边界,因为如果你先判定nums[i]**2 < nums[j]**2,那么你后面的代码只能有一个else语句,因为这个if语句只能有2种情况,就不能再写左边界右边界的判断语句了,注意好这点就行,也就是必须要先判定
if i < 0:#判定左边界是否超出
result.append(nums[j]**2)
j += 1
elif j == n:#判定右边界是否超出
result.append(nums[i]**2)
i -= 1