题解——两种算法解Leetcode题库第977题(暨双指针法小结)

一.Leetcode题库第977题题目

977. 有序数组的平方

二.解法一——暴力解法

  1. 算法思路:for循环遍历数组,对数组元素做平方操作;调用sorted()函数对处理后的数组进行快速排序
  2. 算法时间复杂度:O(n + nlogn)
  3. 代码
class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        for i in range(len(nums)):
            nums[i]*=nums[i]
        nums=sorted(nums)
        return nums

三.解法二——双指针解法

  1. 解题逻辑:一个顺序数组中的负数元素平方后可能会比正数元素平方后更大,所以双指针从两端开始搜索可以保证较大值的准确性
  2. 算法思路 :初始化三个指针位置,一个指第一个元素为前指针,一个指最后一个元素为后指针,另一个指结果数组最后一个元素为结果指针;比较前后指针所指元素平方后的结果,取较大值存入结果指针位置,对应前(或后)指针执行后(或前)移一位的操作,结果指针前移一位,重复以上操作直至前后指针重合为止
  3. 详细代码: 
class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        n=len(nums)
        # 初始化指针及结果数组
        before,after,result=0,n-1,n-1
        Result=[-1]*n # Result数组必须提前初始化,否则在赋值时会报错
        
        # 循环条件:两个指针重合
        while (before<=after):
            # 判断条件:前指针和后指针平方后的大小
            # 操作:取较大值赋给结果指针,同时指示较大值的指针向数组中间移动一位
            if nums[before]**2>nums[after]**2:
                Result[result]=nums[before]**2
                before+=1
            else:
                Result[result]=nums[after]**2
                after-=1
            result-=1
        return Result

四.总结

  1. 双指针法不一定必须是快慢两个指针,也有可能和二分查找一样是前后指针,但解决的关键在于找到判断条件从而确定移动操作
  2. 当题目对时间复杂度要求为O(n),对空间复杂度没有要求,且暴力解法需要双重循环还是一重循环加一个其他排序方法时,则考虑使用双指针法进行解决

 

 

你可能感兴趣的:(Leetcode题解,leetcode,python,数据结构)