周賽293。這題不知道為啥跟我的電波不太合,想了20分鐘想不出來。
眼看超過一千人AC,心急之下弄了個O(N^2)暴力法,果不其然的TLE。

題目

陣列AND運算指的是對陣列中所有的整數做位元&

  • 例如nums=[1,5,3]AND運算,等價於1&5&3=1
  • nums[7],則結果為7

輸入正整數陣列candidates,你可以選擇任意個元素形成組合,且每個索引的元素只能被選擇一次。
陣列AND運算結果大於0的最大組合長度

解法

本來以為是DP,一直糾結要怎麼選擇那些要拿或是不拿,對應的最佳結果怎麼紀錄。
後來仔細想想,只要同位置的1位元出現n次,就可以保證答案不為0,其他位置是0是1根本沒差。
示意圖

維護雜湊表d,紀錄各位元的出現次數,遍歷candidates,將對應的1位元計數+1。
最後看哪個位置1出現最多次,該出現次數就是答案。

class Solution:
    def largestCombination(self, candidates: List[int]) -> int:
        d=Counter()
        for n in candidates:
            i=0
            while n>0:
                if n&1:
                    d[i]+=1
                n>>=1
                i+=1
                
        return max(d.values())

N<=10**7,換算下來最多24個位元,可以遍歷24次candidates,將空間降低到O(1)。

class Solution:
    def largestCombination(self, candidates: List[int]) -> int:
        ans=0
        for i in range(24):
            ans=max(ans,sum(1 for n in candidates if n&(1<<i)))
                    
        return ans