统计有序数组里平方和的数目

2023-06-12  本文已影响0人  塔塔斯坦

题目描述

给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。举例:
nums = {-1,1,1,1},
那么你应该返回的是:1。因为这个数组所有数的平方取值都是1,只有一种取值。
nums = {-1,0,1,2,3}
你应该返回4,因为nums数组所有元素的平方值一共4种取值:1,0,4,9

方法1

每个都算一次平方,存入hash,去除重复的。时空复杂度O(n)

方法2 双指针

时间复杂度O(n), 空间复杂度O(1)

循环外层,保证左指针不大于右指针一直循环,每次找出一个数,循环完就找完了。
循环内, 左右边找出一个abs的最大值作为锚,两头同时开始数,和锚一样的都去掉。

class Solution(object):
    def getSquareCount(self, nums):
        if (len(nums) == 0):
            return 0
        nums = [abs(x) for x in nums]
        left = 0
        right = len(nums) - 1
        result = 0
        while left <= right:
            anchor = max(nums[left], nums[right])
            while left < len(nums) and nums[left] == anchor:
                left += 1
            while right >= 0 and nums[right] == anchor:
                right -= 1
            result += 1
        return result


if __name__ == '__main__':
    assert 1 == Solution().getSquareCount([-1, 1, 1, 1])
    assert 5 == Solution().getSquareCount([-3, -3, -2, -2, -1, -1, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4])
    assert 4 == Solution().getSquareCount([-1, 0, 1, 2, 3])
上一篇下一篇

猜你喜欢

热点阅读