2025-10-03 学习日记

发布于 2025-10-03 12:00 702 字 4 min read 手写 每个字都是我自己敲的。

2025-12-24 学习日记2025-12-17 学习日记2025-12-14 学习日记2025-12-09 学习日记2025-12-08 学习日记2025-12-07 学习日记2025-12-06 学习日记2025-12-05 学习日记2025-12-04 学习日记2025-12-03 学习日记2025-12-02 学习日记2025-12-01 学习日记2025-11-30 学习日记2025-11-29 学习日记2025-11-28 学习日记2025-11-27 学习日记2025-11-26 学习日记2025-11-25 学习日记2025-11-24 学习日记2025-11-23 学习日记2025-11-22 学习日记2025-11-21 学习日记2025-11-20 学习日记2025-11-19 学习日记2025-11-18 学习日记2025-11-17 学习日记2025-11-16 学习日记2025-11-15 学习日记2025-11-14 学习日记2025-11-13 学习日记2025-11-12 学习日记2025-11-11 学习日记2025-11-10 学习日记2025-11-09 学习日记2025-11-08 学习日记2025-11-07 学习日记2025-11-06 学习日记2025-11-05 学习日记2025-11-04 学习日记2025-11-03 学习日记2025-11-02 学习日记2025-11-01 学习日记2025-10-31 学习日记2025-10-30 学习日记2025-10-29 学习日记2025-10-28 学习日记2025-10-27 学习日记2025-10-26 学习日记2025-10-25 学习日记2025-10-24 学习日记2025-10-23 学习日记2025-10-22 学习日记2025-10-21 学习日记2025-10-20 学习日记2025-10-19 学习日记2025-10-18 学习日记2025-10-17 学习日记2025-10-16 学习日记2025-10-15 学习日记2025-10-14 学习日记2025-10-13 学习日记2025-10-11 学习日记2025-10-10 学习日记2025-10-09 学习日记2025-10-03 学习日记2025-10-02 学习日记2025-10-01 学习日记2025-09-30 学习日记2025-09-29 学习日记2025-09-28 学习日记2025-09-27 学习日记2025-09-26 学习日记2025-09-25 学习日记2025-09-24 学习日记2025-09-23 学习日记2025-09-22 学习日记2025-09-21 学习日记2025-09-20 学习日记2025-09-18 学习日记2025-09-17 学习日记2025-09-16 学习日记2025-09-15 学习日记2025-09-14 学习日记2025-09-13 学习日记2025-09-12 学习日记2025-09-11 学习日记2025-09-10 学习日记2025-09-09 学习日记2025-09-08 学习日记2025-09-04 学习日记2025-09-03 学习日记2025-09-02 学习日记2025-09-01 学习日记2025-08-31 学习日记2025-08-29 学习日记2025-08-28 学习日记2025-08-27 学习日记2025-08-26 学习日记2025-08-25 学习日记2025-08-24 周记2025-08-23 学习日记2025-08-22 学习日记2025-08-21 学习日记2025-08-20 学习日记2025-08-19 学习日记2025-08-18 学习日记2025-08-17 周记2025-08-16 学习日记2025-08-15 学习日记2025-08-14 学习日记2025-08-13 学习日记2025-08-12 学习日记2025-08-11 学习日记
今日学习记录 1. 42. 接雨水 关键词: 问题分析: 核心思路: 间接计算面积法 先是一个奇特的方法,就是计算整体包含雨水的面积,因为就是要把整体填满,填满后,再减去整体就是空缺的雨水了 最大前后缀 这个接雨水就是类似一个碗来装水,计算每个位置上能装多少水,就看该位置的前面的最大值和后面的最大值的最小值就行,所以计算前缀和后缀最大值就行

今日学习记录

1. 42. 接雨水

关键词:双指针 栈 问题分析:

核心思路:

间接计算面积法

先是一个奇特的方法,就是计算整体包含雨水的面积,因为就是要把整体填满,填满后,再减去整体就是空缺的雨水了

int trap(vector<int>& height) {

        int n = height.size();

        int left = 0,right = n-1;

        int sum = reduce(height.begin(),height.end(),0);

        int h = 1;

        int ans = 0;

        while(left<=right){

            if(height[left]>=h&&height[right]>=h){

                ans += (right-left+1);

                h++;

            }

            if(height[left]<h) left++;

            if(height[right]<h) right--;

        }

        return ans-sum;

    }

最大前后缀

这个接雨水就是类似一个碗来装水,计算每个位置上能装多少水,就看该位置的前面的最大值和后面的最大值的最小值就行,所以计算前缀和后缀最大值就行

int trap(vector<int>& height) {

        int n = height.size();

        vector<int> pre_mx(n);

        vector<int> suf_mx(n);

        pre_mx[0] = height[0];

        for(int i = 1;i<n;i++){

            pre_mx[i] = max(pre_mx[i-1],height[i]);

        }

        suf_mx[n-1] = height[n-1];

        for(int i = n-2;i>=0;i--){

            suf_mx[i] = max(suf_mx[i+1],height[i]);

        }

        int ans = 0;

        for(int i = 0;i<n;i++){

            ans += min(pre_mx[i],suf_mx[i])-height[i];

        }

        return ans;

    }

相向双指针

接雨水的经典解法,也是最优解

int trap(vector<int>& height) {

        int n = height.size();

        int pre = 0,suf = 0;

        int ans = 0;

        int left = 0,right = n-1;

        while(left<right){

            pre = max(pre,height[left]);

            suf = max(suf,height[right]);

            ans += pre<suf?pre-height[left++]:suf-height[right--];

        }

        return ans;

    }

单调栈

不直接记录左端点,而是计算该点之前的一个数,进行面积范围的计算 注意 while 中<=,这样能省去重复元素的空间

int trap(vector<int>& height) {

        int ans = 0;

        stack<int> s;

        for(int i = 0;i<height.size();i++){

            int h = height[i];

            while(!s.empty()&&height[s.top()]<=h){

                int bt = height[s.top()];

                s.pop();

                if(s.empty()) break;

                int left = s.top();

                int ht = min(h,height[left])-bt;

                ans += ht*(i-left-1);

            }

            s.push(i);

        }

        return ans;

    }

学到的点:

  1. 双指针
  2. 栈

执笔 手写

随机文章

加载中...