力扣hot100——双指针

283. 移动零

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for (int i = 0, j = 0; j < nums.size() || i < nums.size(); j++) {
            if (j >= nums.size()) {
                nums[i++] = 0;
                continue;
            }
            if (nums[j]) nums[i++] = nums[j];
        }
    }
};

双指针,一个指针指向要修改的位置,另一个指针遍历数组

11. 盛最多水的容器

cpp 复制代码
class Solution {
public:
    int maxArea(vector<int>& a) {
        int l = 0, r = a.size() - 1;
        int ans = 0;
        while (l < r) {
            ans = max(ans, (r - l) * min(a[l], a[r]));
            if (a[l] < a[r]) l++;
            else r--;
        }
        return ans;
    }
};

15. 三数之和

cpp 复制代码
class Solution {
public:
    struct node {
        int x, y, z;
        bool operator<(const node& t) const {
            if (x != t.x)
                return x < t.x;
            if (y != t.y)
                return y < t.y;
            if (z != t.z)
                return z < t.z;
            return false;
        }
    };
    vector<vector<int>> threeSum(vector<int>& a) {
        sort(a.begin(), a.end());
        int n = a.size();
        set<node> s;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int t = a[i] + a[j];
                t *= -1;
                int l = i + 1, r = j - 1;
                while (l < r) {
                    int mid = (l + r + 1) / 2;
                    if (a[mid] <= t) l = mid;
                    else r = mid - 1;
                }
                if (l > i && l < j && a[l] == t)
                    s.insert({a[i], a[l], a[j]});

            }
        }
        vector<vector<int>> ans;
        for (auto [x, y, z]: s) {
            ans.push_back({x, y, z});
        }
        return ans;
    }
};

哈希,模拟

42. 接雨水

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> a;
        a.push_back(0);
    
        int n = height.size();
        vector<int> l(n + 10, 0);
        vector<int> r(n + 10, 0);
        for (auto x : height)
            a.push_back(x);
        int ans = 0;
        
        for (int i = 1; i <= n; i++) {
            l[i] = r[i] = a[i];
        }
        stack<int> stk;

        for (int i = 1; i <= n; i++) {
            while (stk.size() && a[i] > a[stk.top()])
                stk.pop();
            if (stk.size()) {
                l[i] = l[stk.top()];
            }
            stk.push(i);
        }
        while (stk.size())
            stk.pop();

        for (int i = n; i >= 1; i--) {
            while (stk.size() && a[i] > a[stk.top()])
                stk.pop();
            if (stk.size()) {
                r[i] = r[stk.top()];
            }
            stk.push(i);
        }
        for (int i = 1; i <= n; i++) {
            int t = min(l[i], r[i]);
            if (t > a[i]) ans += t - a[i];
        }
        // return l[6];
        return ans;
    }
};

单调栈,找每根柱子左边第一个比他大的,右边第一个比他大的,那么这根柱子的贡献就是二者的最小值-它自己

相关推荐
(╹◡╹)1 小时前
18.剪枝
算法·机器学习·剪枝
布莱克6051 小时前
数据库索引分类:数据结构、物理存储与逻辑角度详解
数据结构·数据库
Fa_Mian_Tuan2 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
hanhahai2 小时前
指针与函数(函数指针与指针函数)
算法
ValhallaCoder2 小时前
Leetcode-hot100(2026.08.17)
python·算法·leetcode
泡沫冰@3 小时前
GO 语言基础
开发语言·算法·golang
luj_17684 小时前
元设计的诱惑与现实
c语言·开发语言·c++·经验分享·算法
小星星闪亮登场4 小时前
ST表--倍增思想
开发语言·数据结构·c++·算法·思维
马可家的菠萝4 小时前
Vue3 + Canvas 手绘笔记工程化实践:别把画布只当成一张 PNG
前端·vue.js·算法
watersink4 小时前
机器学习极大似然估计与EM算法
人工智能·算法·机器学习