Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΡ β 2401. Longest Nice Subarray.
π ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
ΠΠ°Π½ ΠΌΠ°ΡΡΠΈΠ² nums
, ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· ΡΠ΅Π»ΡΡ
ΡΠΈΡΠ΅Π».
ΠΡΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ², Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΏΠ°ΡΠ° ΡΠΈΡΠ΅Π» Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ±ΡΠΈΡ
ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ
Π±ΠΈΡΠΎΠ²
(Ρ.Π΅. ΠΈΡ
ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΠΎΠ΅ Π
(&
) ΡΠ°Π²Π½ΠΎ 0
).
ΠΡΠΈΠΌΠ΅Ρ
- π₯ ΠΡ
ΠΎΠ΄:
nums = [1, 3, 8, 48, 10]
- π€ ΠΡΡ
ΠΎΠ΄:
3
- π ΠΠΎΡΡΠ½Π΅Π½ΠΈΠ΅: ΠΠ°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ "ΠΊΡΠ°ΡΠΈΠ²ΡΠΉ" ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²:
[3, 8, 48]
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ:
3 & 8 = 0
3 & 48 = 0
8 & 48 = 0
- ΠΠΈΠΊΠ°ΠΊΠΎΠΉ Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ² Π½Π΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ.
π‘ ΠΠ΄Π΅Ρ
ΠΡΠ΄Π΅ΠΌ ΡΠ΅ΡΠ°ΡΡ Π·Π°Π΄Π°ΡΡ Π² ΡΠΈΡΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΌ ΡΡΠΈΠ»Π΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Ρ
Π½ΠΈΠΊΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π°.
- Π Π°ΡΡΠΈΡΡΠ΅ΠΌ ΠΎΠΊΠ½ΠΎ Π²ΠΏΡΠ°Π²ΠΎ, Π΅ΡΠ»ΠΈ
nums[right]
Π½Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΠ΅Ρ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ Π±ΠΈΡΠΎΠ²ΡΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ.
- Π‘ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ ΡΠ»Π΅Π²Π°, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ.
- ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π±ΠΈΡΠΎΠ²ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ (
cur_bitset
), ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ Π΅Π³ΠΎ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π°.
βοΈ ΠΠ΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΡΠΈΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΈΠΊΠ»ΠΎΠ², ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ:
left
ΠΈ right
β ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ»Π°ΠΉΡΡ Π΄Π»Ρ Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡΠ°Π²ΠΎΠΉ Π³ΡΠ°Π½ΠΈΡ ΠΎΠΊΠ½Π°.
cur_bitset
β ΡΠ΅ΠΊΡΡΠ΅Π΅ Π±ΠΈΡΠΎΠ²ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ.
cur_len
β Π΄Π»ΠΈΠ½Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π°.
max_len
β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ Π΄Π»ΠΈΠ½Ρ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π°.
- ΠΠ°Π·Π° ΡΠ΅ΠΊΡΡΡΠΈΠΈ β Π΅ΡΠ»ΠΈ
right
Π΄ΠΎΡΡΠΈΠ³ ΠΊΠΎΠ½ΡΠ° (ΠΎΠΊΠ°Π·Π°Π»ΡΡ ΠΏΡΡΡΡΠΌ), Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ max_len
.
- Π Π°ΡΡΠΈΡΡΠ΅ΠΌ ΠΎΠΊΠ½ΠΎ, Π΅ΡΠ»ΠΈ
right[0]
Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π±ΠΈΡΠΎΠ²ΡΡ
ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ².
- Π‘ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, ΡΠ΄Π°Π»ΡΡ
left[0]
ΠΈΠ· Π±ΠΈΡΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°.
π ΠΡΠΈΠΌΠΏΡΠΎΡΠΈΠΊΠ°
- ΠΡΠ΅ΠΌΡ:
O(N)
β ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π°.
- ΠΠ°ΠΌΡΡΡ:
O(1)
Π² ΡΠ»ΡΡΠ°Π΅ TCO (Tail Call Optimization);
- ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ
Rust
Π½Π΅ Π΄Π°ΡΡ Π½Π°ΠΌ Π³Π°ΡΠ°Π½ΡΠΈΠΉ Π΄Π»Ρ TCO, ΡΠΎ Π² Ρ
ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΠ΄Π΅Ρ O(N)
Π½Π° ΡΡΡΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠ².
π» ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄
impl Solution {
pub fn longest_nice_subarray(nums: Vec<i32>) -> i32 {
// Recursive helper function to maintain the sliding window
fn slide_window_iter(left: &[i32], right: &[i32], cur_bitset: i32, cur_len: i32, max_len: i32) -> i32 {
match right.first() {
// Base case: when the right pointer reaches the end
None => max_len,
// Expand window if `right_val` has no bitwise conflicts
Some(right_val) if cur_bitset & right_val == 0
=> slide_window_iter(left, &right[1..], cur_bitset | right_val, cur_len + 1, max_len.max(cur_len + 1)),
// Shrink window from the left when there is a conflict
_ => slide_window_iter(&left[1..], right, cur_bitset ^ left[0], cur_len - 1, max_len)
}
}
// Start recursion with the full input array
slide_window_iter(&nums, &nums, 0, 0, 0)
}
}
Tags: #rust #algorithms #slidewindow