LeetCode 3923: Find X Value of Array III (Bitwise AND with Queries)
LeetCode 3923Source: https://leetcode.com/problems/find-x-value-of-array-iii/
English
For each index i, remove nums[i] and compute bitwise AND of the remaining numbers. Prefix AND + suffix AND gives O(n).
class Solution {
public int[] findXValue(int[] nums) {
int n = nums.length;
int allOnes = ~0;
int[] left = new int[n], right = new int[n], ans = new int[n];
left[0] = allOnes;
right[n - 1] = allOnes;
for (int i = 1; i < n; i++) left[i] = left[i - 1] & nums[i - 1];
for (int i = n - 2; i >= 0; i--) right[i] = right[i + 1] & nums[i + 1];
for (int i = 0; i < n; i++) ans[i] = left[i] & right[i];
return ans;
}
}func findXValue(nums []int) []int {
n := len(nums)
allOnes := ^0
left := make([]int, n)
right := make([]int, n)
ans := make([]int, n)
left[0], right[n-1] = allOnes, allOnes
for i := 1; i < n; i++ { left[i] = left[i-1] & nums[i-1] }
for i := n - 2; i >= 0; i-- { right[i] = right[i+1] & nums[i+1] }
for i := 0; i < n; i++ { ans[i] = left[i] & right[i] }
return ans
}class Solution {
public:
vector<int> findXValue(vector<int>& nums) {
int n = nums.size();
int allOnes = ~0;
vector<int> left(n), right(n), ans(n);
left[0] = allOnes;
right[n - 1] = allOnes;
for (int i = 1; i < n; i++) left[i] = left[i - 1] & nums[i - 1];
for (int i = n - 2; i >= 0; i--) right[i] = right[i + 1] & nums[i + 1];
for (int i = 0; i < n; i++) ans[i] = left[i] & right[i];
return ans;
}
};class Solution:
def findXValue(self, nums: list[int]) -> list[int]:
n = len(nums)
all_ones = (1 << 31) - 1
left = [0] * n
right = [0] * n
ans = [0] * n
left[0] = all_ones
right[-1] = all_ones
for i in range(1, n):
left[i] = left[i - 1] & nums[i - 1]
for i in range(n - 2, -1, -1):
right[i] = right[i + 1] & nums[i + 1]
for i in range(n):
ans[i] = left[i] & right[i]
return ansfunction findXValue(nums) {
const n = nums.length;
const ALL_ONES = 0x7fffffff;
const left = Array(n).fill(0), right = Array(n).fill(0), ans = Array(n).fill(0);
left[0] = ALL_ONES;
right[n - 1] = ALL_ONES;
for (let i = 1; i < n; i++) left[i] = left[i - 1] & nums[i - 1];
for (let i = n - 2; i >= 0; i--) right[i] = right[i + 1] & nums[i + 1];
for (let i = 0; i < n; i++) ans[i] = left[i] & right[i];
return ans;
}中文
对每个 i 删除 nums[i] 后求其余元素按位与,利用前缀 AND 与后缀 AND 可把复杂度降到 O(n)。
class Solution {
public int[] findXValue(int[] nums) {
int n = nums.length;
int allOnes = ~0;
int[] left = new int[n], right = new int[n], ans = new int[n];
left[0] = allOnes;
right[n - 1] = allOnes;
for (int i = 1; i < n; i++) left[i] = left[i - 1] & nums[i - 1];
for (int i = n - 2; i >= 0; i--) right[i] = right[i + 1] & nums[i + 1];
for (int i = 0; i < n; i++) ans[i] = left[i] & right[i];
return ans;
}
}func findXValue(nums []int) []int {
n := len(nums)
allOnes := ^0
left := make([]int, n)
right := make([]int, n)
ans := make([]int, n)
left[0], right[n-1] = allOnes, allOnes
for i := 1; i < n; i++ { left[i] = left[i-1] & nums[i-1] }
for i := n - 2; i >= 0; i-- { right[i] = right[i+1] & nums[i+1] }
for i := 0; i < n; i++ { ans[i] = left[i] & right[i] }
return ans
}class Solution {
public:
vector<int> findXValue(vector<int>& nums) {
int n = nums.size();
int allOnes = ~0;
vector<int> left(n), right(n), ans(n);
left[0] = allOnes;
right[n - 1] = allOnes;
for (int i = 1; i < n; i++) left[i] = left[i - 1] & nums[i - 1];
for (int i = n - 2; i >= 0; i--) right[i] = right[i + 1] & nums[i + 1];
for (int i = 0; i < n; i++) ans[i] = left[i] & right[i];
return ans;
}
};class Solution:
def findXValue(self, nums: list[int]) -> list[int]:
n = len(nums)
all_ones = (1 << 31) - 1
left = [0] * n
right = [0] * n
ans = [0] * n
left[0] = all_ones
right[-1] = all_ones
for i in range(1, n):
left[i] = left[i - 1] & nums[i - 1]
for i in range(n - 2, -1, -1):
right[i] = right[i + 1] & nums[i + 1]
for i in range(n):
ans[i] = left[i] & right[i]
return ansfunction findXValue(nums) {
const n = nums.length;
const ALL_ONES = 0x7fffffff;
const left = Array(n).fill(0), right = Array(n).fill(0), ans = Array(n).fill(0);
left[0] = ALL_ONES;
right[n - 1] = ALL_ONES;
for (let i = 1; i < n; i++) left[i] = left[i - 1] & nums[i - 1];
for (let i = n - 2; i >= 0; i--) right[i] = right[i + 1] & nums[i + 1];
for (let i = 0; i < n; i++) ans[i] = left[i] & right[i];
return ans;
}
Comments