C++ 双指针思路OJ题

这篇具有很好参考价值的文章主要介绍了C++ 双指针思路OJ题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、283. 移动零

二、1089. 复写零

三、202. 快乐数

四、11. 盛最多水的容器

五、611.有效三角形的个数

六、LCR 179. 查找总价格为目标值的两个商品

七、15. 三数之和

八、18. 四数之和


一、283. 移动零

C++ 双指针思路OJ题,算法OJ,c++,算法

思路:变量cur从零开始负责遍历数组,dest起始在-1位置,负责找到值为0的元素。遍历数组,当前元素值不为零,则交换dest和cur位置的值,dest后移一位,无论是否找到零元素,每次遍历后cur均后移一位。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cur = 0, dest = -1;
        while (cur < nums.size()) {
            if (nums[cur] != 0) {
                swap(nums[++dest], nums[cur]);
            }
            ++cur;
        }
    }
};

dest起始位置也可以从0开始 。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cur = 0, dest = 0;
        while (cur < nums.size()) {
            if (nums[cur] != 0) {
                swap(nums[dest++], nums[cur]);
            }
            ++cur;
        }
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法

二、1089. 复写零

 C++ 双指针思路OJ题,算法OJ,c++,算法

 思路:首先cur找到修改后数组的最后一位元素,dest统计修改数组元素个数(大于等于原数组大小即cur找到修改后数组末尾元素),然后借助cur和dest位置,实现从后向前将非零元素后移一位,零元素后移一位,之后空出来的前项也赋值为零,还需处理特殊情况:desr大于数组元素个数时C++ 双指针思路OJ题,算法OJ,c++,算法

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = 0, dest = -1, n = arr.size();
        while (cur < n) {
            if (arr[cur])
                dest++;
            else
                dest += 2;
            if (dest >= n - 1)
                break;
            ++cur;
        }
        if (dest == n) {
            arr[n - 1] = 0;
            dest -= 2;
            cur--;
        }
        while (cur >= 0) {
            if (arr[cur]) {
                arr[dest--] = arr[cur--];
            } else {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法

三、202. 快乐数

C++ 双指针思路OJ题,算法OJ,c++,算法

 思路:快慢指针思想

C++ 双指针思路OJ题,算法OJ,c++,算法

class Solution {
public:
    int bitSum(int n) {
        int sum = 0;
        while (n) {
            int temp = n % 10;
            sum += temp * temp;
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int slow = n, fast = n;
        do {
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        } while (slow != fast);
        return slow == 1;
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法

四、11. 盛最多水的容器

C++ 双指针思路OJ题,算法OJ,c++,算法

思路:初始位置从最左端和最右端开始,先计算一次容积,然后与上一次的容积相比求最大值,如果左端比右端小,则对左端后移一位,反之对右端前移一位,循环往复直到左右端相遇。 

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, right = height.size() - 1, ret = 0;
        while (left < right) {
            int tmp = (right - left) * min(height[left], height[right]);
            ret = max(ret, tmp);
            if (height[left] < height[right]) {
                left++;
            } else {
                right--;
            }
        }
        return ret;
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法

五、611.有效三角形的个数

C++ 双指针思路OJ题,算法OJ,c++,算法

思路:

  1. 首先对数组排序,以便利用有序数组(升序)的单调性。
  2. 外层从后往前(大到小)遍历作为三角形的第三条边,内层以数组索引为0的值即最左端,作为其中一条边。
  3. 以每次第三条边的前一个位置即右端,作为其中一条边,对两边相加之和与第三条边作比较,如果大于第三边,则左端到右端范围内与右端和第三边的组合均为有效的三角形组合,接着右端后移一位。如果小于第三边,则左端后移一位(增大),以此规则循环找出所有适合当前第三边的组合。
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int ret = 0, n = nums.size();
        for (int i = n - 1; i >= 2; i--) {
            int left = 0, right = i - 1;
            while (left < right) {
                if (nums[left] + nums[right] > nums[i]) {
                    ret += right - left;
                    right--;
                } else {
                    left++;
                }
            }
        }
        return ret;
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法

六、LCR 179. 查找总价格为目标值的两个商品

C++ 双指针思路OJ题,算法OJ,c++,算法

思路:利用有序数组的单调性,从数组最左和最右分别开始求和,与目标值相比较,如果小于目标值则最左位置后移一位(增大以接近目标值),如果大于目标值则最右向前一位(减小以接近目标值)。

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        int left = 0, right = price.size() - 1;
        while (left < right) {
            int sum = price[left] + price[right];
            if (sum < target) {
                left++;
            } else if (sum > target) {
                right--;
            } else {
                return {price[left], price[right]};
            }
        }
        return {-1, -1};
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法

  • {price[left], price[right]}表示一个初始化了两个元素的向量(vector),{-1, -1}也是一个初始化了两个元素的向量,这种用法可以方便地返回多个值或结果。
  • 在C++中,使用花括号{}可以用于初始化数组、向量和其他容器类型的对象。在这个特定的情况下,通过使用花括号初始化向量,可以直接返回一个包含两个元素的向量作为函数的返回值。

七、15. 三数之和

C++ 双指针思路OJ题,算法OJ,c++,算法

 思路:1、排序  2、双指针

每次固定一个数,从该数后一位到最后这段区间内找到两个数,其相加之和等于该数的相反数即符合要求,注意处理越界和重复问题。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;
        sort(nums.begin(), nums.end());
        int n = nums.size();
        for (int i = 0; i < n;) {
            if (nums[i] > 0)
                break;
            int left = i + 1, right = n - 1, target = -nums[i];
            while (left < right) {
                int sum = nums[left] + nums[right];
                if (sum > target)
                    right--;
                else if (sum < target)
                    left++;
                else {
                    ret.push_back({nums[i], nums[left], nums[right]});
                    left++, right--;
                    while (left < right && nums[left] == nums[left - 1])
                        left++;
                    while (left < right && nums[right] == nums[right + 1])
                        right--;
                }
            }
            ++i;
            while (i < n && nums[i] == nums[i - 1])
                i++;
        }
        return ret;
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法

八、18. 四数之和

C++ 双指针思路OJ题,算法OJ,c++,算法

思路:排序+双指针,每次固定两个数,从第二个数往后的区间内,分别从左端和右端计算求和,寻找和等于目标值减去已固定两数的组合即为一个满足条件的四元组。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        if (nums.size() < 4)
            return ret; // 处理数组长度小于4的情况
        sort(nums.begin(), nums.end());
        int n = nums.size();
        for (int i = 0; i < n;) {
            for (int j = i + 1; j < n;) {
                int left = j + 1, right = n - 1;
                long long aim = (long long)target - nums[i] - nums[j];
                while (left < right) {
                    int sum = nums[left] + nums[right];
                    if (sum > aim)
                        right--;
                    else if (sum < aim)
                        left++;
                    else {
                        ret.push_back(
                            {nums[i], nums[j], nums[left++], nums[right--]});
                        while (left < right && nums[left] == nums[left - 1])
                            left++;
                        while (left < right && nums[right] == nums[right + 1])
                            right--;
                    }
                }
                j++;
                while (j < n && nums[j] == nums[j - 1])
                    j++;
            }
            i++;
            while (i < n && nums[i] == nums[i - 1])
                i++;
        }
        return ret;
    }
};

C++ 双指针思路OJ题,算法OJ,c++,算法文章来源地址https://www.toymoban.com/news/detail-816945.html

到了这里,关于C++ 双指针思路OJ题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】算法(模拟、指针等)解决字符串类题目(C++)

    字符串题目有很多种,这里筛选几个考察模拟、双指针等的题目,并用相关算法解决。 思路 题意分析 :题目要求找到字符串数组中的最长公共前缀。 解法一 : 两两比较 遍历数组,每次比较后更新最长公共前缀,并循环比较找最长公共前缀 解法二 : 统一比较 遍历第一个

    2024年01月16日
    浏览(46)
  • 链式二叉树OJ题思路分享

    ⏩博主CSDN主页:杭电码农-NEO⏩   ⏩专栏分类:刷题分享⏪   ⏩代码仓库:NEO的学习日记⏩   🌹关注我🫵带你刷更多C语言和数据结构的题!   🔝🔝 链式二叉树这一个板块的考题还是比较多的,这里我给大家分享几道很经典的OJ题,仅供参考! 分别是 1. 单值二叉树 力扣965题--

    2024年02月06日
    浏览(33)
  • 链表习题-力扣oj (附加思路版)

    LCR 140. 训练计划 II https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/         给定一个头节点为  head  的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第  cnt  个训练项目编号。 思路:双指针, 快指针先走cnt步 然后快慢指针同时向前走,当快指

    2024年03月09日
    浏览(79)
  • 【链表OJ 11】复制带随机指针的链表

    前言:  💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到原节点的后面 2.2控制拷贝节点的random     2.3拷贝节点解下来尾插组成拷

    2024年02月09日
    浏览(51)
  • 【数据结构OJ题】复制带随机指针的链表

    原题链接:https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 此题可以分三步进行: 1. 拷贝链表的每一个结点,拷贝的结点先链接到被拷贝结点的后面。 2. 复制随机指针的链接:拷贝结点的随机指针指向被拷贝结点随机指针的下

    2024年02月12日
    浏览(70)
  • 【华为OD机试真题 C++】1118 - 最大利润 | 机试题+算法思路+考点+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Python语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述 商人经营一家店铺, 有number种商品,由于仓库限

    2024年02月04日
    浏览(67)
  • 【华为OD机试真题 C++】1109 - 优雅子数组 | 机试题+算法思路+考点+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Python语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述

    2024年02月06日
    浏览(54)
  • 【每日算法 && 数据结构(C++)】—— 03 | 合并两个有序数组(解题思路、流程图、代码片段)

    An inch of time is an inch of gold, but you can’t buy that inch of time with an inch of gold. An inch of time is an inch of gold, but you can\\\'t buy that inch of time with an inch of gold 给你两个有序数组,请将两个数组进行合并,并且合并后的数组也必须有序 这个题目要求将两个有序数组合并成一个有序数组。在数

    2024年02月11日
    浏览(56)
  • 【华为OD机试真题 C++语言】68、矩阵扩散 | 机试题+算法思路+考点+代码解析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C++语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述 存在一个m*n的二维数组,其成员取值范围为0或1

    2024年02月16日
    浏览(61)
  • 【每日算法 && 数据结构(C++)】—— 02 | 数组的并交集(解题思路、流程图、代码片段)

    When you feel like giving up, remember why you started. 当你想放弃时,请记住为什么你开始 给你两个数组,请分别求出两个数组的交集和并集 在数学中,我们可以通过交集和并集来描述两个集合之间的关系。 交集(Intersection) :指的是两个集合中共有的元素组成的集合。可以用符号

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包