【题目/训练】:双指针

引言

我们已经在这篇博客 【算法/学习】双指针-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;

    }
};
相关推荐
cpp_250122 分钟前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解
月光船幽幽26 分钟前
门控函数SHS阈值与调制机制解析
人工智能·python·算法
Doraemomo34 分钟前
数据结构-哈希表
数据结构·算法·散列表
君君思密达41 分钟前
Leetcode Hot 100 题目详解-哈希表
数据结构·算法·leetcode
lucas_AI42 分钟前
Muse Glimmer 30B:Meta 难得给的真开源,强在哪、虚在哪
人工智能·算法
ai产品老杨1 小时前
国产NPU视觉算法完整流程
算法
过期的秋刀鱼!1 小时前
带替换的采样
人工智能·python·算法·决策树·机器学习
过期的秋刀鱼!1 小时前
使用多个决策树
人工智能·算法·决策树·机器学习·数据挖掘
203号居民2 小时前
LeetCode hot 100 —560. 和为 K 的子数组
java·算法·leetcode
退休倒计时2 小时前
【每日一题】LeetCode 20. 有效的括号 TypeScript
算法·leetcode·职场和发展·typescript