ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-20 23:32:07  阅读:203  来源: 互联网

标签:977 insert nums day2 mid pos 力扣 front reslst


题目

给你一个按 非递减顺序 排序的整数数组 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有