【刷题—双指针】复写0、三数之和、四数之和

news2024/9/21 23:07:23

目录

  • 一、复写0
  • 二、三数之和
  • 三、四数之和

一、复写0

题目:
在这里插入图片描述
注意:题目要求是原数组上复写

思路:
一、确定最后一个复写的位置。定义两个变量cur等于0,dest等于-1,让cur去遍历数组。如果cur指向的元素是0,dest往后两步,非0,往后一步。判断dest的位置,如果大于等于n-1,就停止操作,否则cur++

  1. 根据cur指向的元素dest跳一步还是两步
  2. dest移动操作
  3. 判断dest的位置,如果是大于等于n-1就跳出后面的操作
  4. cur++

二、细节处理。有可能dest走到了n的位置,说明cur遇到了0,0多出来了一个,dest就要往前移动两步,cur往前移动一步,并且n-1即最后一个元素变成0

三、复写。cur指向的元素是0,dest指向的元素覆盖成0,dest往前移动一步,然后此时这个位置再覆盖成0,dest往前一步,cur往前一步;cur指向的元素不是0,dest指向的元素覆盖成0,dest往前移动一步,cur往前一步。

代码:

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int n = arr.size();
        int cur = 0, dest = -1;
        // 确定最后一个复写的位置
        while (dest != n - 1)
        {
            if (arr[cur] == 0)
            {
                dest += 2;
                if (dest >= n - 1) break;
            }
            else
            {
                dest++;
                if (dest >= n - 1) break;
            }
            cur++;
        }
        // 细节处理
        if (dest == n)
        {
            arr[n - 1] = 0;
            dest -= 2;
            cur--;
        }
        // 复写操作
        while (cur >= 0)
        {
            if (arr[cur] == 0)
            {
                arr[dest--] = arr[cur];
                arr[dest--] = arr[cur--];
            }
            else
            {
                arr[dest--] = arr[cur--];
            }
        }
    }
};

二、三数之和

题目:
在这里插入图片描述
思路:
先排序,固定一个数,剩下的操作是两数之和。目标数是0-固定的数。注意去重。遇到合法的数放入ret,然后还要去重。

代码:

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; i++)
        {
            // 去重
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            int target = 0 - nums[i];
            int left = i + 1, right = n - 1;
            // 不漏
            while (left < right)
            {
                if (nums[left] + nums[right] > target)
                {
                    right--;
                }
                else if (nums[left] + nums[right] < target)
                {
                    left++;
                }
                else
                {
                    ret.push_back({ nums[i], nums[left], nums[right] });
                    right--;
                    left++;
                    // 去重
                    while (left < right && nums[right] == nums[right + 1])
                        --right;
                    while (left < right && nums[left] == nums[left - 1])
                        ++left;
                }
            }
        }
        return ret;
    }
};

三、四数之和

题目:
在这里插入图片描述
注意:不重复,数据范围

思路:同三数之和,多一层循环固定数,目标数是变量。排序、去重、不漏。

代码:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        // 排序
        sort(nums.begin(), nums.end());
        int n = nums.size();
        // a+b+c+d=target => a+b+c=target-d => a+b = target-d-c
        for (int i = 0; i < n; i++)
        {
            if (i > 0 && nums[i] == nums[i - 1]) continue;// 去重
            long long k = target - nums[i];
            for (int j = i + 1; j < n; j++)
            {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;// 去重
                long long tmp = k - nums[j];
                // 两数之和
                int left = j + 1, right = n - 1;
                while (left < right) // 不漏
                {
                    if (nums[left] + nums[right] > tmp)
                    {
                        right--;
                    }
                    else if (nums[left] + nums[right] < tmp)
                    {
                        left++;
                    }
                    else
                    {
                        ret.push_back({ nums[i], nums[j], nums[left], nums[right] });
                        right--;
                        while (left < right && nums[right] == nums[right + 1])// 去重
                            right--;
                        left++;
                        while (left < right && nums[left] == nums[left - 1])// 去重
                            left++;
                    }
                }
            }
        }
        return ret;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[SAP ABAP] 创建数据元素

我们可以使用事务码SE11创建数据元素 输入要创建的数据类型的名称&#xff0c;然后点击创建 选择数据元素并进行确定 输入简短描述并为数据元素分配一个域&#xff0c;会自动带出数据类型以及长度 创建域可参考该篇文章 创建域https://blog.csdn.net/Hudas/article/details/…

Hive企业级调优[6]——HQL语法优化之任务并行度

目录 HQL语法优化之任务并行度 优化说明 Map端并行度 Reduce端并行度 优化案例 HQL语法优化之任务并行度 优化说明 对于分布式计算任务来说&#xff0c;设置一个合理的并行度至关重要。Hive的计算任务依赖于MapReduce框架来完成&#xff0c;因此并行度的调整需要从Map端和…

YOLOv10 简介

YOLOv10&#xff0c;由清华大学的研究人员基于 Ultralytics Python 包构建&#xff0c;引入了一种全新的实时目标检测方法&#xff0c;该方法解决了以往 YOLO 版本中后处理和模型架构方面的不足。通过消除非极大值抑制&#xff08;NMS&#xff09;并优化各种模型组件&#xff0…

C# 技巧在 foreach 循环中巧妙获取索引

目录 前言 使用 LINQ 和扩展方法 直接在 LINQ 查询中使用 使用 LINQ 的 Select() 与 Enumerable.Range() 总结 最后 前言 在C#中foreach 循环是处理集合的常见方式&#xff0c;因其简洁性和易读性而广受青睐。 但是在某些情况下&#xff0c;我们需要同时获取集合中元素的…

mysql中的json查询

首先来构造数据 查询department里面name等于研发部的数据 查询语句跟普通的sql语句差不多&#xff0c;也就是字段名要用到path表达式 select * from user u where u.department->$.name 研发部 模糊查询 select * from user u where u.department->$.name like %研发%…

论文阅读笔记:Sapiens: Foundation for Human Vision Models

Sapiens: Foundation for Human Vision Models 1 背景1.1 问题1.2 目标 2 方法3 创新点4 模块4.1 Humans-300M数据集4.2 预训练4.3 2D位姿估计4.4 身体部位分割4.5 深度估计4.6 表面法线估计 5 实验5.1 实现细节5.2 2D位姿估计5.3 身体部位分割5.4 深度估计5.5 表面法线估计5.6…

如何在 Ubuntu 上安装 OpenSSH Server ?

OpenSSH 是一组工具集合&#xff0c;它允许您使用 SSH 在网络上进行安全、加密的通信。它包括安全远程登录、文件传输和应用程序隧道的特性。OpenSSH 通常用于 Linux 系统上的安全远程访问和文件传输。由于其强大的安全措施&#xff0c;受到世界各地许多用户的信任。 本教程将…

【Rust练习】16.模式

文章题目来自&#xff1a;https://practice-zh.course.rs/pattern-match/patterns.html 1 &#x1f31f;&#x1f31f; 使用 | 可以匹配多个值, 而使用 … 可以匹配一个闭区间的数值序列 fn main() {} fn match_number(n: i32) {match n {// 匹配一个单独的值1 > println!(…

2024 研究生数学建模竞赛(E题)建模秘籍|高速公路应急车道紧急启用模型|文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用聚类分析&#xff0c;逻辑回归模型&#xff0c;决策树/规则&#xff0c;ARIMA等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始…

Python基于TensorFlow实现Transformer分类模型(Transformer分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着深度学习技术的发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进步。…

人工智能开发实战推荐算法应用解析

内容导读 个性化推荐思路推荐算法分类推荐效果评估 一、个性化推荐思路 推荐系统能为你提供个性化的智能服务&#xff0c;是基于以下事实认知&#xff1a;人们倾向于喜欢那些与自己喜欢的东西相似的其它物品&#xff0c;或倾向于与自己趣味相投的人有相似的爱好&#xff0c;…

9.安卓逆向-安卓开发基础-安卓四大组件2

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

mysql为什么建议创建字段的时候not null

相信大家在建表或者给表新加字段的时候&#xff0c;一些老司机们都会建议我们&#xff0c;字段要定义为not null&#xff0c;原因呢是一是占用存储空间&#xff0c;另一个是避免出现一些意料之外的错误。当然针对这个问题&#xff0c;大家可能也会在网上去搜下&#xff0c;不过…

C语言中的一些小知识(三)

一、你了解printf()吗&#xff1f; 你知道下面代码的输出结果吗&#xff1f; int a123; printf("%2d \n",a); printf() 函数是 C 语言中用于格式化输出的标准函数&#xff0c;它允许你将数据以特定的格式输出到标准输出设备&#xff08;通常是屏幕&#xff09;。p…

20240921全国计算机二级Python考试(大头博士计算二级)

一、背景需求&#xff1a; 20240921我在上海应用技术大学44号楼考场参加2024年9月的全国计算机二级&#xff08;Python语言程序设计&#xff09;考试。 时隔多年&#xff0c;再次来到大学校园&#xff0c;恍若隔世 扫码找考场在哪里 考场须知 1、进考场&#xff0c;先刷身份证…

有关elementui form验证问题,有值却仍然显示不通过

参考链接 有关elementui form验证问题&#xff0c;有值却仍然显示不通过 - 一棵写代码的柳树 - 博客园 需要保证表单上的 :model" "和prop" "对应的属性相同 el-form 绑定数据:model 和 规则:rules input 绑定 数据表单里的数据 其父组件提供校验所绑定的…

Mybatis的XML实现方法

Mybatis的开发有两种方式&#xff1a; 1、注解 2、XML 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置文件中。 Mybatis的XML的实现需要以下…

leetcode练习 二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3提示&#xff1a; 树中节点的数量在 [0, 104] 区间内。-100 …

java使用ByteBuffer进行多文件合并和拆分

1.背景 因为验证证书的需要&#xff0c;需要把证书文件和公钥给到客户&#xff0c;考虑到多个文件交互的不便性&#xff0c;所以决定将2个文件合并成一个文件交互给客户。刚开始采用字符串拼接2个文件内容&#xff0c;但是由于是加密文件&#xff0c;采用字符串形式合并后&…

fastadmin 部署后前台会员中心出现404错误

访问前台会员中心出现404错误。 解决&#xff1a;nginx访问站点增加伪静态 location / {if (!-e $request_filename){rewrite ^(.*)$ /index.php?s$1 last; break;} }在phpstydy中增加伪静态&#xff0c;如图&#xff1a;