力扣 三数之和-15

news2024/11/24 9:38:09

三数之和-15

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int temp = 0;
        //定义一个二维vector数组
        vector<vector<int>> ans;
        int n = nums.size();
        //对nums数组进行排序
        sort(nums.begin(), nums.end());
        //固定索引为k的元素,利用双指针去找另外两个元素与这个固定元素相加之和为0
        for (int k = 0; k < n; k++) {//
        //跳过相同元素
            if (k > 0 && nums[k] == nums[k - 1])
                continue;
            //定义双指针,l从k+1开始遍历,r从n-1开始遍历
            int l = k + 1, r = n-1;
            //while循环开始找符合条件的另外两个数
            while (l < r) {
                //题目要求l != r && l != k && r != k
                if (l != r && l != k && r != k) {
                    //如果固定的值小于0,那么另外两个值的加和应该为fabs(nums[k])
                    if (nums[k] < 0) {
                        //找到两数加和等于fabs(nums[k]),说明已经找到另外两个数了
                        if (nums[l] + nums[r] == fabs(nums[k])) {
                            //将固定的数和另外找到的两个存入二维数组中
                            ans.push_back({nums[k], nums[l], nums[r]});
                            //利用两个while循环跳过相同元素
                            while (l < r && nums[l] == nums[l + 1])
                                l++;
                            while (l < r && nums[r] == nums[r - 1])
                                r--;
                            //移动指针
                            l++;
                            r--;
                        //如果两数加和大于fabs(nums[k]),缩小右边界
                        } else if (nums[l] + nums[r] > fabs(nums[k]))
                            r--;
                        //如果两数加和小于fabs(nums[k]),缩小左边界
                        else
                            l++;
                    }
                    //如果固定的值大于等于0,那么另外两个值的加和应该为-nums[k],其余同上面相似
                    if (nums[k] >= 0) {
                        if (nums[l] + nums[r] == -nums[k]) {
                            ans.push_back({nums[k], nums[l], nums[r]});
                            while (l < r && nums[l] == nums[l + 1])
                                l++;
                            while (l < r && nums[r] == nums[r - 1])
                                r--;
                            l++;
                            r--;
                        } else if (nums[l] + nums[r] > -nums[k])
                            r--;
                        else
                            l++;
                    }
                }
            }
        }
        return ans;
    }
};

每日问题

什么是C++中的模板特化和偏特化?如何进行模板特化和偏特化?

C++中的模板特化和偏特化

        模板特化和偏特化是C++模板的高级特性,用于为特定类型或参数模式提供专门的实现。

1.模板特化

        模板特化是对模板进行完全具体化,提供针对某些特定类型的特殊实现,而不使用通用模板版本。

如何进行模板特化

        定义一个通过模板。

        使用template<>语法为特定类型定义专门的实现。

语法
template<typename T>
class MyClass{
  //通用模板  
};
template<>//模板特化
class MyClass<int>{
    //针对int类型的实现
}
示例
#include<iostream>
using namespace std;
//通用模板
template<typename T>
class MyClass{
public:
    void display(){
        cout<<"General template" <<endl;    
    }
};
//模板特化:针对int类型
template<>
class MyClass<int>{
public:
    void display(){
        cout<<"Specialized for int"<<endl;    
    }
};
int main(){
    MyClass<double>obj1;
    obj1.display();//输出:General template
    
    MyClass<int>obj2;
    obj2.diplay();//输出:Specialized for int
    
    return 0;
}
应用场景

        为特定类型提供优化的实现

        针对某些类型实现特殊的逻辑

2.模板偏特化

        模板偏特化是部分具体化模板的实现。它允许固定某些模板参数的值或模式,而其他参数仍保持通用性。

如何进行模板偏特化

        定义一个通用模板。

        使用部分模板参数固定,定义偏特化的实现。

语法
template<typename T1,typename T2>
class MyClass{
    //通用模板    
};
template<typename T>
class MyClass<T,int>{
    //偏特化版本,第二个参数固定为int
}
示例
#include<iostream>
using namespace std;
//通用模板
template <typename T1,typename T2>
class MyClass{
public:
    void display(){
        cout<<"General template"<<endl;   
    }
};
//偏特化版本:第二个参数固定为int
template <typename T>
class MyClass <T,int>{
public:
    void display(){
        cout<<"Partial specialization where T2 = int" << endl;   
    }
};

int main(){
    MyClass<double,char>obj1;
    obj1.display();//输出:General template
    
    MyClass<double,int>obj1;
    obj2.display();//输出:Partial specialization where T2 = int
    return 0;                
}

应用场景

        当部分参数固定时,使用特化版本以实现优化不同逻辑。

        为一组特定类型的组合提供定制的行为

3.特化与偏特化的区别

4.偏特化的限制

        偏特化无法直接用于函数模板,只能用于类模板

        可以通过函数重载或SFINAE(模板的替代失败非错误)来模拟函数模板偏特化。

函数模板重载实例
#include<iostream>
using namespace std;
template <typename T>
通用函数模板
void func(T val){
    cout<<"General template:"<<val<<endl;
}
//函数模板重载:针对 int 类型
void func(int val){
    cout<<"Specialized for int:"<<val<<endl;
}
int main(){
    func(3.14);//输出:General template:3.14
    func(42);//输出:Specialized for int:42
    
    return 0;
}

总结

1.模板特化:

        完全具体化,为特定类型实现特殊版本。

        使用template<>语法。

2.模板偏特化:

        部分具体化,处理一组参数模式。

        使用部分固定参数定义版本。

3.函数模板没有偏特化 ,可以使用重载或SFINAE间接实现类似效果。特化和偏特化使模板更灵活,可用于优化、处理特殊类型或参数模式的需求。

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

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

相关文章

深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&…

Transformer架构笔记

Attention is All You Need. 3.Model Architecture 3.1 整体架构如图 3.2 Encoder与Decoder Encoder&#xff1a;由 N 6 N6 N6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer&#xff1a;多头注意力和MLP&#xff08;FFN&#xff0c;前馈神经网络&#xff09;&…

【大数据学习 | Spark-Core】spark-shell开发

spark的代码分为两种 本地代码在driver端直接解析执行没有后续 集群代码&#xff0c;会在driver端进行解析&#xff0c;然后让多个机器进行集群形式的执行计算 spark-shell --master spark://nn1:7077 --executor-cores 2 --executor-memory 2G sc.textFile("/home/ha…

增量预训练(Pretrain)样本拼接篇

增量预训练&#xff08;Pretrain&#xff09;样本拼接篇 一、Pretrain阶段&#xff0c;为什么需要拼接拼接&#xff1f; 为了提高pretrain效率、拓展LLM最大长度&#xff0c;随机将若干条短文本进行拼接是pretrain阶段常见手段。 二、有哪些拼接方式&#xff1f; 拼接方式一…

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像&#xff1a;通过双像素可以实现&#xff1a;深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上&#xff0c;也有遮罩等方式的pd生成&#xff0c;如图双像素视图可以看到光圈的不同一半&#x…

从零开始-VitePress 构建个人博客上传GitHub自动构建访问

从零开始-VitePress 构建个人博客上传GitHub自动构建访问 序言 VitePress 官网&#xff1a;VitePress 中文版 1. 什么是 VitePress VitePress 是一个静态站点生成器 (SSG)&#xff0c;专为构建快速、以内容为中心的站点而设计。简而言之&#xff0c;VitePress 获取用 Markdown…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传

【51单片机】红外遥控

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 红外遥控硬件电路 NEC协议编码编程实例LCD1602显示Data红外遥控控制扇叶转速 红外遥控 红外遥控是利用红外光进行通信的设备&#…

【解决】Unity TMPro字体中文显示错误/不全问题

问题描述&#xff1a;字体变成方块 原因&#xff1a;字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源&#xff08;蓝色的大F&#xff09; 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1&#xff08;Generative Pre-trained Transformer&#xff09;是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构&#xff0c;具有如下创新点&#xff1a; NLP领域的迁移学习&#xff1a;通过最…

CKA认证 | Day2 K8s内部监控与日志

第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中&#xff0c;查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释&#xff0c;帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟&#xff0c;不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面&#xff0c;很多运维人员都更熟悉虚拟化环境&#xff0c;对“容器圈”的各种概念容易混淆&#xff1a;容器就是 Kubernetes 吗&#xff1f;容器云又是什么&#xff1f;容器…

JDBC编程---Java

目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源&#xff0c;并设置数据库所在的位置&#xff0c;三条固定写法 2.建立和数据库服务器之间的连接&#xff0c;连接好了后&#xff…

移动充储机器人“小奥”的多场景应用(上)

在当前现代化城市交通体系中&#xff0c;移动充储机器人“小奥”发挥着至关重要的作用。该机器人不仅是一个简单的设备&#xff0c;而是一个集成了高科技的移动充电站&#xff0c;为新能源汽车提供了一种前所未有的便捷充电解决方案。该机器人配备了先进的电池管理系统&#xf…

element dialog会隐藏body scroll 导致tab抖动 解决方案如下

element dialog会隐藏body scroll 导致tab抖动 解决方案如下 在dialog标签添加 :lockScroll"false"搞定

Android 功耗分析(底层篇)

最近在网上发现关于功耗分析系列的文章很少&#xff0c;介绍详细的更少&#xff0c;于是便想记录总结一下功耗分析的相关知识&#xff0c;有不对的地方希望大家多指出&#xff0c;互相学习。本系列分为底层篇和上层篇。 大概从基础知识&#xff0c;测试手法&#xff0c;以及案例…

Bugku CTF_Web——my-first-sqli

Bugku CTF_Web——my-first-sqli 进入靶场 随便输一个看看 点login没有任何回显 方法一&#xff1a; 上bp抓包 放到repeter测试 试试万能密码&#xff08;靶机过期了重新开了个靶机&#xff09; admin or 11--shellmates{SQLi_goeS_BrrRrRR}方法二&#xff1a; 拿包直接梭…

BUUCTF—Reverse—easyre(1)

非常简单的逆向 拿到exe文件先查下信息&#xff0c;是一个64位程序&#xff0c;没有加壳&#xff08;壳是对代码的加密&#xff0c;起混淆保护的作用&#xff0c;一般用来阻止逆向&#xff09;。 然后拖进IDA(64位)进行反汇编 打开以后就可以看到flag flag{this_Is_a_EaSyRe}

全面击破工程级复杂缓存难题

目录 一、走进业务中的缓存 &#xff08;一&#xff09;本地缓存 &#xff08;二&#xff09;分布式缓存 二、缓存更新模式分析 &#xff08;一&#xff09;Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; 读操作流程 写操作流程 流程问题思考 问题1&#…

React基础知识一

写的东西太多了&#xff0c;照成csdn文档编辑器都开始卡顿了&#xff0c;所以分篇写。 1.安装React 需要安装下面三个包。 react:react核心包 react-dom:渲染需要用到的核心包 babel:将jsx语法转换成React代码的工具。&#xff08;没使用jsx可以不装&#xff09;1.1 在html中…