Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/2419.html
2419. Longest Subarray With Maximum Bitwise AND
- Difficulty: Medium.
- Related Topics: .
- Similar Questions: Number of Different Integers in a String, Remove Colored Pieces if Both Neighbors are the Same Color, Count Number of Maximum Bitwise-OR Subsets, Smallest Subarrays With Maximum Bitwise OR.
Problem
You are given an integer array nums
of size n
.
Consider a non-empty subarray from nums
that has the maximum possible bitwise AND.
- In other words, let
k
be the maximum value of the bitwise AND of any subarray ofnums
. Then, only subarrays with a bitwise AND equal tok
should be considered.
Return the length of the **longest such subarray**.
The bitwise AND of an array is the bitwise AND of all the numbers in it.
A subarray is a contiguous sequence of elements within an array.
Example 1:
Input: nums = [1,2,3,3,2,2]
Output: 2
Explanation:
The maximum possible bitwise AND of a subarray is 3.
The longest subarray with that value is [3,3], so we return 2.
Example 2:
Input: nums = [1,2,3,4]
Output: 1
Explanation:
The maximum possible bitwise AND of a subarray is 4.
The longest subarray with that value is [4], so we return 1.
Constraints:
-
1 <= nums.length <= 10^5
-
1 <= nums[i] <= 10^6
Solution (Java, C++, Python)
-
class Solution { public int longestSubarray(int[] nums) { int mx = 0; for (int v : nums) { mx = Math.max(mx, v); } int ans = 0, cnt = 0; for (int v : nums) { if (v == mx) { ++cnt; ans = Math.max(ans, cnt); } else { cnt = 0; } } return ans; } }
-
class Solution { public: int longestSubarray(vector<int>& nums) { int mx = *max_element(nums.begin(), nums.end()); int ans = 0, cnt = 0; for (int v : nums) { if (v == mx) { ++cnt; ans = max(ans, cnt); } else { cnt = 0; } } return ans; } };
-
class Solution: def longestSubarray(self, nums: List[int]) -> int: mx = max(nums) ans = cnt = 0 for v in nums: if v == mx: cnt += 1 ans = max(ans, cnt) else: cnt = 0 return ans
-
func longestSubarray(nums []int) int { mx := 0 for _, v := range nums { mx = max(mx, v) } ans, cnt := 0, 0 for _, v := range nums { if v == mx { cnt++ ans = max(ans, cnt) } else { cnt = 0 } } return ans } func max(a, b int) int { if a > b { return a } return b }
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).