|
| 1 | +想法:須先觀察找到規律,可以找到 nums[start ... end] 的 XOR score 會等於 nums[start ... end - 1] ^ nums[ start + 1 ... end] 的結果 |
| 2 | +為了要找到subarray的最大值,用一個max_score的陣列儲存結果;而每個max_score陣列都只要考慮本身的 nums[start ... end] 以及 max_score[ start ... end - 1 ] , |
| 3 | +max_score[start + 1 ... end] 即可,因為後兩者都已經在之前被算過了,可以代表該範圍的最大數值,而start ... end 也只需要多考慮 start ... end 的本身數值即可 |
| 4 | + |
| 5 | +Time Complexity : O(n ^ 2) for finding the dp array and max score array |
| 6 | +Space Complexity : O(n ^ 2) for dp array , max score array |
| 7 | + |
| 8 | +class Solution { |
| 9 | +public: |
| 10 | + vector<int> maximumSubarrayXor(vector<int>& nums, vector<vector<int>>& queries) { |
| 11 | + int n = nums.size() ; |
| 12 | + vector< vector<int> > dp( n , vector<int>(n) ) ; |
| 13 | + vector< vector<int> > max_score( n , vector<int>(n) ) ; |
| 14 | + // base case |
| 15 | + for(int i = 0 ; i < n ; i++) { |
| 16 | + dp[i][i] = nums[i] ; |
| 17 | + max_score[i][i] = dp[i][i] ; |
| 18 | + } |
| 19 | + |
| 20 | + // construct dp array |
| 21 | + for( int len = 2 ; len <= n ; len++ ) { |
| 22 | + for( int start = 0 ; start + len - 1 < n ; start++ ) { |
| 23 | + dp[start][ start + len - 1 ] |
| 24 | + = dp[start][start + len - 2] ^ dp[start + 1][start + len - 1] ; |
| 25 | + max_score[start][start + len - 1] = dp[start][start + len - 1] ; |
| 26 | + } |
| 27 | + } |
| 28 | + |
| 29 | + for( int len = 2 ; len <= n ; len++ ) { |
| 30 | + for(int start = 0 ; start + len - 1 < n ; start++) { |
| 31 | + max_score[start][start + len - 1] |
| 32 | + = max( {max_score[start][start + len - 1] |
| 33 | + , max_score[start][start + len - 2] |
| 34 | + , max_score[start + 1][start + len - 1]} ) ; |
| 35 | + } |
| 36 | + } |
| 37 | + |
| 38 | + vector<int> answer ; |
| 39 | + for( auto &i : queries ) { |
| 40 | + answer.push_back( max_score[ i[0] ][ i[1] ] ) ; |
| 41 | + } |
| 42 | + |
| 43 | + return answer ; |
| 44 | + } |
| 45 | +}; |
0 commit comments