143. 重排链表

每天一道Rust-LeetCode(2019-01-01)

坚持每天一道题,刷题学习Rust.

题目描述

给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

因为是单向链表,所以先以收集后半部分的节点,
然后进行插入操作

解题过程

struct Solution {}
impl Solution {
    pub fn trap(height: Vec<i32>) -> i32 {
        let mut stack = Vec::new();
        let mut total = 0;
        for i in 0..height.len() {
            //要把0也放进去,把0放进去,简化了很多问题
            while stack.len() > 0 && height[*stack.last().unwrap()] < height[i] {
                let pop_top = stack.pop().unwrap();
                if stack.is_empty() {
                    break;
                }
                let top = *stack.last().unwrap();
                let distance = i - top - 1;
                let height = min(height[i], height[top]) - height[pop_top];
                total += height * distance as i32
            }
            //            println!("push {}={}", i, height[i]);
            stack.push(i);
        }
        total
    }
}
#[cfg(test)]
mod test {
    use super::*;
    use crate::share::*;
    #[test]
    fn test() {
        let t = Solution::trap(vec![0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]);
        assert_eq!(t, 6);
        let t = Solution::trap(vec![4, 2, 3]);
        assert_eq!(t, 1);
        let t = Solution::trap(vec![5, 2, 1, 2, 1, 5]);
        assert_eq!(t, 14);
    }
}

一点感悟

如果不过滤0,那么碰到这种请0 1 2,这种情况,2进来的时候,很自然能够算出左侧0能够承载的雨水量就是0

其他

欢迎关注我的github,本项目文章所有代码都可以找到.

xxxxxxxsgg dsgggg 本站总访问量 本站访客数人次