【题目/训练】:双指针

引言

我们已经在这篇博客 【算法/学习】双指针-CSDN博客里面讲了双指针、二分等的相关知识。

现在我们来做一些训练吧

经典例题

1. 移动零

思路:

使用 0 当做这个中间点,把不等于 0(注意题目没说不能有负数)的放到中间点的左边,等于 0 的放到其右边。

这的中间点就是 0 本身,所以实现起来比快速排序简单很多,然后使用双指针 i 和 j,只要 numsi!=0,我们就交换 numsi 和 numsj

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        if (nums.size() == 0) return;

        // 双指针,前后交换即可
        int j = 0;
        for (int i = 0; i < nums.size(); i++) {
            //当前元素!=0,就把其交换到左边,等于0的交换到右边
            if (nums[i] != 0) {
                swap(nums[i], nums[j++]);
            }
        }
    }
};

2. 复写零

思路:

cpp 复制代码
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        // 1. 找到最后一个复写数 
        int cur = 0, dest = -1, n = arr.size();
        while (cur < n)
        {
            if (arr[cur]) dest++;
            else dest += 2;
            if (dest >= n - 1) break;
            cur++;
        }

        // 2. 处理边界清空
        if (dest == n)
        {
            arr[n - 1] = 0;
            cur--, dest -= 2;
        }

        // 3. 从后往前完成复写操作
        while (cur >= 0)
        {
            if (arr[cur]) arr[dest--] = arr[cur--];
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }

    }
};

3. 有效三角形的个数

思路:

首先对数组排序。
固定最短的两条边,二分查找最后一个小于两边之和的位置。可以求得固定两条边长之和满足条件的结果。枚举结束后,总和就是答案。

cpp 复制代码
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        // 1. 排序来优化
        sort(nums.begin(), nums.end());

        // 2. 利用双指针来解决问题 
        int ret = 0, n = nums.size();
        for (int i = n - 1; i >= 2; i--) // 先固定最大的数
        {
            // 利用双指针快速统计符合要求的三元组个数
            int l = 0, r = i - 1;
            while (l < r)
            {
                if (nums[l] + nums[r] > nums[i])
                {
                    ret += r - l;
                    r--;
                }
                else l++;
            }
        }
        return ret;

    }
};
相关推荐
ZhengEnCi10 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考10 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
夜不会漫长12 小时前
C++:红黑树
数据结构·算法
AI备案指南-满满13 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
Ramble_Naylor13 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
秋天的怀念_David13 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
不一样的故事12613 小时前
NB/T 47013.8-2015 附录D 吸枪技术
人工智能·经验分享·算法
通问AI13 小时前
用 200 行 Python 给文档库做「上下文完整度」自检:四个可复算的检查项
算法
揽星河..14 小时前
【C语言】扫雷游戏
c语言·算法·游戏
丘山录14 小时前
本地部署 LongCat-2.5,要 7 台机器我只有 4 台
人工智能·算法