diff --git a/src/main.rs b/src/main.rs index 18d2f04..63c5cf6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,44 +1,35 @@ use std::cmp::max; +use std::mem::swap; struct Solution; impl Solution { - pub fn max_total_fruits(fruits: Vec>, start_pos: i32, k: i32) -> i32 { - let mut left = fruits - .binary_search_by(|x| x[0].cmp(&(start_pos - k))) - .unwrap_or_else(|x| x); - let (mut right, mut temp_ans) = (left, 0); - while right < fruits.len() && fruits[right][0] <= start_pos { - temp_ans += fruits[right][1]; - right += 1; - } - let mut ans = temp_ans; - while right < fruits.len() && fruits[right][0] <= start_pos + k { - temp_ans += fruits[right][1]; - while fruits[right][0] - fruits[left][0] + fruits[right][0] - start_pos > k - && fruits[right][0] - fruits[left][0] + start_pos - fruits[left][0] > k - { - temp_ans -= fruits[left][1]; - left += 1; + pub fn total_fruit(fruits: Vec) -> i32 { + let mut ans = 0; + let (mut a,mut b) = (-1,-1); + let mut temp_ans = 0; + let mut sub_temp_ans = 0; + for fruit in fruits { + if fruit != a && fruit != b { + ans = max(ans, temp_ans); + temp_ans = sub_temp_ans + 1; + sub_temp_ans = 1; + b = a; + a = fruit; + } + else { + temp_ans += 1; + sub_temp_ans += 1; + if b == fruit { + swap(&mut a, &mut b); + sub_temp_ans = 1; + } } - ans = max(ans, temp_ans); - right += 1; } - ans + max(ans, temp_ans) } } fn main() { - let sl = Solution::max_total_fruits( - vec![ - vec![0, 9], - vec![4, 1], - vec![5, 7], - vec![6, 2], - vec![7, 4], - vec![10, 9], - ], - 5, - 4, - ); + let sl = Solution::total_fruit(vec![3,3,3,1,2,1,1,2,3,3,4]); println!("{:?}", sl); }