977.順序付けられた配列の2乗
非降順でソートされた整数配列Aが与えられた場合、各数値の2乗で構成される新しい配列を返します。また、非降順でソートする必要があります。
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ステートメントを1つしか含めることができないためです。このため、ifステートメントには2つのケースしかなく、左境界と右境界の判断ステートメントを記述できなくなりました。この点に注意してください。つまり、最初に決定する必要があります。
if i < 0:#判定左边界是否超出
result.append(nums[j]**2)
j += 1
elif j == n:#判定右边界是否超出
result.append(nums[i]**2)
i -= 1