周賽327。

題目

輸入非遞減排序的整數陣列nums,求正數和負數個數中的最大值。
換句話說,如果nums中有pos個正數和neg個負數,回傳pos和neg兩者中的最大值。

注意:0不是正數也不是負數。

解法

直接統計正負數,然後回傳最大值。

時間複雜度O(N)。空間複雜度O(1)。

class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        pos=neg=0
        for n in nums:
            if n>0:
                pos+=1
            elif n<0:
                neg+=1
                
        return max(pos,neg)

一行版本。

class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        return max(sum(1 for n in nums if n>0),sum(1 for n in nums if n<0))

上面方法沒有利用到陣列的有序特性,可以透過二分搜找到最後一個負數以及最後一個0的位置,直接計算正負個數。

時間複雜度O(log N)。空間複雜度O(1)。

class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        N=len(nums)
        last_neg=bisect_left(nums,0)-1
        last_zero=bisect_right(nums,0)-1
        
        neg=last_neg+1
        pos=N-(last_zero+1)
        
        return max(neg,pos)