Skip to content

Commit 9e6e165

Browse files
authored
Create Maximum XOR Score Subarray Queries
1 parent fd9a85e commit 9e6e165

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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

Comments
 (0)