2210. 统计数组中峰和谷的数量

This commit is contained in:
li-chx 2025-07-27 10:15:01 +08:00
parent 911aa923cb
commit ca0e9fdd9e
1 changed files with 25 additions and 18 deletions

View File

@ -1,30 +1,37 @@
struct Solution; struct Solution;
impl Solution { impl Solution {
pub fn max_subarrays(n: i32, mut conflicting_pairs: Vec<Vec<i32>>) -> i64 { pub fn count_hill_valley(nums: Vec<i32>) -> i32 {
let mut arr: Vec<Vec<i32>> = vec![vec![]; (n + 1) as usize]; let mut down = false;
for pair in conflicting_pairs.iter_mut() { for i in 1..nums.len() {
if pair[0] > pair[1] { if nums[i] != nums[0]{
pair.swap(0, 1); down = nums[i] < nums[0];
break;
} }
arr[pair[0] as usize].push(pair[1]);
} }
let mut ans: i64 = 0; let mut ans = 0;
let mut extra: Vec<i64> = vec![0; (n + 2) as usize]; for i in 2..nums.len() {
let mut b: Vec<i64> = vec![(n + 1) as i64; (n + 1) as usize]; if nums[i] == nums[i-1]
for i in (1..=n as usize).rev() { {
b.extend(arr[i].iter().map(|&x| x as i64)); continue;
b.sort_unstable(); }
b.truncate(2); if down && nums[i] >nums[i-1]
{
ans += (b[0] as i64) - (i as i64); ans += 1;
extra[b[0] as usize] += b[1] - b[0]; down = false;
continue;
}
if !down && nums[i] < nums[i-1] {
ans += 1;
down = true;
continue;
}
} }
ans + *extra.iter().max().unwrap() as i64 ans
} }
} }
fn main() { fn main() {
let sl = Solution::max_subarrays(5, vec![vec![1, 2], vec![2, 5], vec![3, 5]]); let sl = Solution::count_hill_valley(vec![6,6,5,5,4,1]);
println!("{}", sl); println!("{}", sl);
} }