子序列的按位或 Bitwise ORs of Subarrays
阿新 • • 發佈:2018-09-23
覆蓋 暴力求解 alt return hset div size bubuko csharp
2018-09-23 19:05:20
問題描述:
問題求解:
顯然的是暴力的遍歷所有的區間是不可取的,因為這樣的時間復雜度為n^2級別的,對於規模在50000左右的輸入會TLE。
然而,最後的解答也可以看作是一個暴力求解,也就是用Set來保存以當前數為結尾的左右可能解,在下一輪中遍歷上一輪的所有解並進行或操作。
這裏有個難以一下想到的地方就是,乍一看,這個時間復雜度依然是平方級別的,但是實際上,這裏的時間復雜度是n級別的,因為Set中後一個數中的1完全覆蓋前一個數,因此,最多只有不超過30個數在Set中,因此整個時間復雜度依然是線性的時間復雜度。
public int subarrayBitwiseORs(int[] A) { Set<Integer> res = new HashSet<>(); Set<Integer> cur = new HashSet<>(); for (int i : A) { Set<Integer> tmp = new HashSet<>(); tmp.add(i); for (Integer j : cur) tmp.add(i | j); res.addAll(tmp); cur = tmp; } return res.size(); }
子序列的按位或 Bitwise ORs of Subarrays