周賽312。這題真是要了我的命,一直糾結怎麼對AND運算做復原動作,浪費了好久時間才恍然大悟。

題目

輸入大小n的整數陣列nums。
存在一個nums的非空子陣列,他有著最大的位元AND運算總和。

換句話說,假設k是所有nums子陣列中做位元AND運算的最大值,要找到所有值為k的子陣列。
求符合以上條件的子陣列中,最長長度為多少。

解法

講這麼多,聰明的朋友應該要立刻想到,nums中不管怎麼AND運算,其子陣列最大值一定就是nums中的最大值。
根本不用找什麼子陣列還是滑動窗口,直接找最大值mx最多連續出現幾次就好。

先找到nums中的最大值mx,然後遍歷第二次,貪心地找由mx所連續組成的子陣列。

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

class Solution:
    def longestSubarray(self, nums: List[int]) -> int:
        ans=1
        mx=max(nums)
        cnt=0
        
        for n in nums:
            if n==mx:
                cnt+=1
                ans=max(ans,cnt)
            else:
                cnt=0
            
        return ans

也可以簡化成一次遍歷,邊找最大數字,邊更新長度。

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

class Solution:
    def longestSubarray(self, nums: List[int]) -> int:
        ans=1
        mx=-inf
        cnt=0
        
        for n in nums:
            if n>mx:
                mx=n
                ans=cnt=1
            elif n==mx:
                cnt+=1
            else:
                cnt=0
            ans=max(ans,cnt)
            
        return ans