其他分享
首页 > 其他分享> > 【力扣刷题 day2】977.有序数组的平方 简单

【力扣刷题 day2】977.有序数组的平方 简单

作者:互联网

题目

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

思路

当0号位小于0时,取出,使用二分查找将其绝对值插入,最后一起平方。注意长度为1时单独讨论

结果

在这里插入图片描述
不忍直视

代码

class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """

        lenn = len(nums)

        if(lenn==1):
            nums[0] *= nums[0]
            return nums
        
        while(nums[0]<0):
            temp = abs(nums[0]) #取出第一个负数的绝对值
            del nums[0] #删除第一个负数

            start,end = 0,lenn-2
            mid = (start + end) / 2
            while(start <= end):
                mid = (start+end)/2
                if(temp == nums[mid]):
                    nums.insert(mid+1,temp)
                    break #插入,跳出
                elif(temp > nums[mid]):
                    start = mid+1
                else:
                    end = mid-1

            if(start > end):#没找到相等的
                if(temp>nums[mid]):
                    nums.insert(mid + 1, temp)
                else:
                    nums.insert(mid, temp)

        for i in range(0,lenn):
            nums[i] *= nums[i]

        return nums


改进 双指针

头尾一起

class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        
        '''双指针'''
        reslst = []
        front,post = 0,len(nums)-1
        while(front != post):
            f = abs(nums[front])
            p = abs(nums[post])
            
            if(f>p):
                reslst.insert(0,f*f)
                front+=1
            else:
                reslst.insert(0,p*p) 
                post-=1
        reslst.insert(0, nums[front]*nums[front])
        return reslst

但是这样时间很长,可能因为每次都在第一个加,动态变化 ,可以直接把答案列表设置成n个长度,用pos记录存放位置

class Solution:
    def sortedSquares(self, nums):
        n = len(nums)
        ans = [0] * n
        
        i, j, pos = 0, n - 1, n - 1
        while i <= j:
            if nums[i] * nums[i] > nums[j] * nums[j]:
                ans[pos] = nums[i] * nums[i]
                i += 1
            else:
                ans[pos] = nums[j] * nums[j]
                j -= 1
            pos -= 1
        
        return ans

标签:977,insert,nums,day2,mid,pos,力扣,front,reslst
来源: https://blog.csdn.net/IT_muggle/article/details/118941605