Compare commits

...

2 Commits

Author SHA1 Message Date
li-chx f6a1b6df26 1695. 删除子数组的最大得分 2025-07-22 21:59:38 +08:00
li-chx 473f02c269 3169. 无需开会的工作日 2025-07-11 09:26:00 +08:00
1 changed files with 28 additions and 66 deletions

View File

@ -1,82 +1,44 @@
use std::cmp::max; use std::cmp::max;
use std::collections::HashMap;
struct Solution; struct Solution;
impl Solution { impl Solution {
pub fn max_free_time(event_time: i32, start_time: Vec<i32>, end_time: Vec<i32>) -> i32 { pub fn maximum_unique_subarray(nums: Vec<i32>) -> i32 {
let mut first_selection = 0; let mut map: HashMap<i32, usize> = HashMap::new();
let mut second_selection = 0; let mut ans = 0;
let mut third_selection = 0; for i in 0..nums.len() {
if map.contains_key(&nums[i]) {
if end_time[end_time.len() - 1] < event_time { let l = i - map.len();
first_selection = event_time - end_time[end_time.len() - 1]; let r = i;
} let mut temp = 0;
let mut last_time = 0; let mut j = l;
for i in 0..start_time.len() { while j < r {
if start_time[i] > last_time { temp += nums[j];
let val = start_time[i] - last_time; j+=1;
if val > first_selection {
third_selection = second_selection;
second_selection = first_selection;
first_selection = val;
} else if val > second_selection {
third_selection = second_selection;
second_selection = val;
} else if val > third_selection {
third_selection = val;
} }
} ans = max(ans, temp);
last_time = end_time[i]; j = l;
} while nums[j] != nums[i] {
map.remove(&nums[j]);
let check_can_add = |left_space: i32, right_space: i32, needed: i32| -> bool { j += 1;
if needed <= third_selection {
return true;
}
if needed <= second_selection {
if left_space == second_selection && right_space == first_selection ||
left_space == first_selection && right_space == second_selection {
return false;
} }
return true; map.insert(nums[i], i);
} }
if needed <= first_selection { else {
if left_space != first_selection && right_space != first_selection { map.insert(nums[i], i);
return true;
}
} }
return false;
};
last_time = end_time[0];
let mut last = start_time[0];
let mut ans = start_time[0];
for i in 1..start_time.len() {
let left_space = last;
let right_space = start_time[i] - last_time;
let new_val = if check_can_add(left_space, right_space, end_time[i - 1] - start_time[i - 1]) {
left_space + right_space + end_time[i - 1] - start_time[i - 1]
} else {
left_space + right_space
};
ans = max(ans, new_val);
last = right_space;
last_time = end_time[i];
} }
{ let mut temp = 0;
let left_space = last; let mut j = nums.len() - map.len();
let right_space = event_time - last_time; while j < nums.len() {
let new_val = if check_can_add(left_space, right_space, end_time[end_time.len() - 1] - start_time[end_time.len() - 1]) { temp += nums[j];
left_space + right_space + end_time[end_time.len() - 1] j += 1;
- start_time[end_time.len() - 1]
} else {
left_space + right_space
};
ans = max(ans, new_val);
} }
ans max(ans, temp)
} }
} }
fn main() { fn main() {
let sl = Solution::max_free_time(5, vec![1, 3], vec![2, 5]); let sl = Solution::maximum_unique_subarray(vec![4,2,4,5,6]);
println!("{}", sl); println!("{}", sl);
} }