Welcome to Subscribe On Youtube
3287. Find the Maximum Sequence Value of Array
Description
You are given an integer array nums
and a positive integer k
.
The value of a sequence seq
of size 2 * x
is defined as:
(seq[0] OR seq[1] OR ... OR seq[x - 1]) XOR (seq[x] OR seq[x + 1] OR ... OR seq[2 * x - 1])
.
Return the maximum value of any subsequence of nums
having size 2 * k
.
Example 1:
Input: nums = [2,6,7], k = 1
Output: 5
Explanation:
The subsequence [2, 7]
has the maximum value of 2 XOR 7 = 5
.
Example 2:
Input: nums = [4,2,5,6,7], k = 2
Output: 2
Explanation:
The subsequence [4, 5, 6, 7]
has the maximum value of (4 OR 5) XOR (6 OR 7) = 2
.
Constraints:
2 <= nums.length <= 400
1 <= nums[i] < 27
1 <= k <= nums.length / 2
Solutions
Solution 1
-
class Solution { public int maxValue(int[] nums, int k) { int m = 1 << 7; int n = nums.length; boolean[][][] f = new boolean[n + 1][k + 2][m]; f[0][0][0] = true; for (int i = 0; i < n; i++) { for (int j = 0; j <= k; j++) { for (int x = 0; x < m; x++) { if (f[i][j][x]) { f[i + 1][j][x] = true; f[i + 1][j + 1][x | nums[i]] = true; } } } } boolean[][][] g = new boolean[n + 1][k + 2][m]; g[n][0][0] = true; for (int i = n; i > 0; i--) { for (int j = 0; j <= k; j++) { for (int y = 0; y < m; y++) { if (g[i][j][y]) { g[i - 1][j][y] = true; g[i - 1][j + 1][y | nums[i - 1]] = true; } } } } int ans = 0; for (int i = k; i <= n - k; i++) { for (int x = 0; x < m; x++) { if (f[i][k][x]) { for (int y = 0; y < m; y++) { if (g[i][k][y]) { ans = Math.max(ans, x ^ y); } } } } } return ans; } }
-
class Solution { public: int maxValue(vector<int>& nums, int k) { int m = 1 << 7; int n = nums.size(); vector<vector<vector<bool>>> f(n + 1, vector<vector<bool>>(k + 2, vector<bool>(m, false))); f[0][0][0] = true; for (int i = 0; i < n; i++) { for (int j = 0; j <= k; j++) { for (int x = 0; x < m; x++) { if (f[i][j][x]) { f[i + 1][j][x] = true; f[i + 1][j + 1][x | nums[i]] = true; } } } } vector<vector<vector<bool>>> g(n + 1, vector<vector<bool>>(k + 2, vector<bool>(m, false))); g[n][0][0] = true; for (int i = n; i > 0; i--) { for (int j = 0; j <= k; j++) { for (int y = 0; y < m; y++) { if (g[i][j][y]) { g[i - 1][j][y] = true; g[i - 1][j + 1][y | nums[i - 1]] = true; } } } } int ans = 0; for (int i = k; i <= n - k; i++) { for (int x = 0; x < m; x++) { if (f[i][k][x]) { for (int y = 0; y < m; y++) { if (g[i][k][y]) { ans = max(ans, x ^ y); } } } } } return ans; } };
-
class Solution: def maxValue(self, nums: List[int], k: int) -> int: m = 1 << 7 n = len(nums) f = [[[False] * m for _ in range(k + 2)] for _ in range(n + 1)] f[0][0][0] = True for i in range(n): for j in range(k + 1): for x in range(m): f[i + 1][j][x] |= f[i][j][x] f[i + 1][j + 1][x | nums[i]] |= f[i][j][x] g = [[[False] * m for _ in range(k + 2)] for _ in range(n + 1)] g[n][0][0] = True for i in range(n, 0, -1): for j in range(k + 1): for y in range(m): g[i - 1][j][y] |= g[i][j][y] g[i - 1][j + 1][y | nums[i - 1]] |= g[i][j][y] ans = 0 for i in range(k, n - k + 1): for x in range(m): if f[i][k][x]: for y in range(m): if g[i][k][y]: ans = max(ans, x ^ y) return ans
-
func maxValue(nums []int, k int) int { m := 1 << 7 n := len(nums) f := make([][][]bool, n+1) for i := range f { f[i] = make([][]bool, k+2) for j := range f[i] { f[i][j] = make([]bool, m) } } f[0][0][0] = true for i := 0; i < n; i++ { for j := 0; j <= k; j++ { for x := 0; x < m; x++ { if f[i][j][x] { f[i+1][j][x] = true f[i+1][j+1][x|nums[i]] = true } } } } g := make([][][]bool, n+1) for i := range g { g[i] = make([][]bool, k+2) for j := range g[i] { g[i][j] = make([]bool, m) } } g[n][0][0] = true for i := n; i > 0; i-- { for j := 0; j <= k; j++ { for y := 0; y < m; y++ { if g[i][j][y] { g[i-1][j][y] = true g[i-1][j+1][y|nums[i-1]] = true } } } } ans := 0 for i := k; i <= n-k; i++ { for x := 0; x < m; x++ { if f[i][k][x] { for y := 0; y < m; y++ { if g[i][k][y] { ans = max(ans, x^y) } } } } } return ans }
-
function maxValue(nums: number[], k: number): number { const m = 1 << 7; const n = nums.length; const f: boolean[][][] = Array.from({ length: n + 1 }, () => Array.from({ length: k + 2 }, () => Array(m).fill(false)), ); f[0][0][0] = true; for (let i = 0; i < n; i++) { for (let j = 0; j <= k; j++) { for (let x = 0; x < m; x++) { if (f[i][j][x]) { f[i + 1][j][x] = true; f[i + 1][j + 1][x | nums[i]] = true; } } } } const g: boolean[][][] = Array.from({ length: n + 1 }, () => Array.from({ length: k + 2 }, () => Array(m).fill(false)), ); g[n][0][0] = true; for (let i = n; i > 0; i--) { for (let j = 0; j <= k; j++) { for (let y = 0; y < m; y++) { if (g[i][j][y]) { g[i - 1][j][y] = true; g[i - 1][j + 1][y | nums[i - 1]] = true; } } } } let ans = 0; for (let i = k; i <= n - k; i++) { for (let x = 0; x < m; x++) { if (f[i][k][x]) { for (let y = 0; y < m; y++) { if (g[i][k][y]) { ans = Math.max(ans, x ^ y); } } } } } return ans; }