学习目标:
学习用双指针解决有序数的平方排序
学习内容:
题目:给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
一.从分界点向两边移动
开始想到使用平方后排序,很简单,但是后来学习了一种新方法,虽然我感觉还难一些,但是是新方法,因为原数组是按照递增的方法排序的,所以可以找到中间的分界点。
n = 0 # n表示索引值
lens = len(nums)
neg = -1
for num in nums:
if num < 0:
neg = n
else:
break
n += 1
neg就为分界点
用i,j分别表示neg左边和右边的起点,i向左边走,j向右边走,i -= 1,j +=1。
循环到i<0,并且j>=总长度len(nums)。
ans = list()
i,j = neg,neg+1
while i>=0 or j<lens:
考虑一下情况
1.当i小于0后,j还没结束,那么就依次将nums[j]填入ans,j向后移动
if i<0:
ans.append(nums[j]*nums[j])
j += 1
2.当j到达最后后,i还没有到达0,那么依次将nums[i]填入ans,i向前移动
elif j >= lens:
ans.append(nums[i]*nums[i])
i -= 1
3.如果nums[i]^2比nums[j]^2小,就将nums[i]填入ans,i向前移动
elif nums[i]*nums[i] < nums[j]*nums[j]:
ans.append(nums[i]*nums[i])
i -= 1
4.其他情况为nums[i]^2比nums[j]^2大,nums[i]^2和nums[j]^2相等,就将nums[j]填入ans,j向后移动
else:
ans.append(nums[j]*nums[j])
j += 1
最后返回排序后的数组ans
return ans
完整代码
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
n = 0 # n表示索引值
lens = len(nums)
neg = -1
for num in nums:
if num < 0:
neg = n
else:
break
n += 1
ans = list()
i,j = neg,neg+1
while i>=0 or j<lens:
if i<0:
ans.append(nums[j]*nums[j])
j += 1
elif j >= lens:
ans.append(nums[i]*nums[i])
i -= 1
elif nums[i]*nums[i] < nums[j]*nums[j]:
ans.append(nums[i]*nums[i])
i -= 1
else:
ans.append(nums[j]*nums[j])
j += 1
return ans
二.从两边向中间移动
在两边向中间移动
两个边界为0和len(nums)-1,用i,j表示。k表示当前排序到达的位置,从后到前。
然后比较nums[i]^2和nums[j]^2大小,大的放到最后
但是不能将小的放到第一个,因为不是降序的,两端的平方一定是两边最大的,只能将大的放出来。如果是从中间开始的,只能放小的到第一个,因为两端 的是最小的。
循环到i大于等于j为止。
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
lens = len(nums)
i,j,k = 0,lens-1,lens-1
ans = [0]*lens
while i<=j:
if nums[i]*nums[i] < nums[j]*nums[j]:
ans[k] = nums[j]*nums[j]
j -= 1
else:
ans[k] = nums[i]*nums[i]
i += 1
k -=1
return ans
学习时间:
2022年9月4日
学习位置:
1.力扣977,189