力扣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 分钟前
数据在内存中的存储(2)
开发语言·c++·算法
认真学GIS1 分钟前
逐3小时降水量!全国2421个气象站点1951-2024年逐3小时尺度长时间序列降水量(EXCEL格式)数据
人工智能·算法·机器学习
聆风吟º3 分钟前
【数据结构手札】顺序表实战指南(二):结构体构建 | 初始化 | 打印 | 销毁
数据结构·初始化顺序表·销毁顺序表·打印顺序表
智航GIS6 分钟前
ArcGIS大师之路500技---039趋势面法
算法·arcgis
量子炒饭大师6 分钟前
Cyber骇客的LIFO深渊与FIFO管道 ——【初阶数据结构与算法】栈与队列
c语言·数据结构·c++·链表
智航GIS7 分钟前
ArcGIS大师之路500技---038反距离权重法
算法·arcgis
YGGP11 分钟前
【Golang】LeetCode 31. 下一个排列
算法·leetcode
小猪咪piggy11 分钟前
【算法】leetcode100 堆、栈
算法
元亓亓亓14 分钟前
LeetCode热题100--70. 爬楼梯--简单
算法·leetcode·职场和发展
一起养小猫17 分钟前
LeetCode100天Day3-判断子序列与汇总区间
java·数据结构·算法·leetcode