每日一题——四数之和(双指针解法)

news2024/10/7 16:27:15

每日一题

四数之和

在这里插入图片描述

注:

如果大家没做过题目两数之和、三数之和,强烈建议先去做做,也可以参考我之前写的博客,这样做这一题会事半功倍,且由于本题思路和三数之和十分类似,故对于解题思路,也不会过多讲解,有不懂的可以参考三数之和

思路

  • 本题和三数之和思想类似,同样是采用双指针的方法,只是由于多了一个数,因此也要多套一层for循环

  • 同样,我们要先保证数组有序,因此首先就要对数组进行排序

  • 在《三数之和》中,我们使用一层for循环来遍历数组(相当于先确定第一个数a的值),然后再利用双指针right和left确定另外两个数b,c的值,然后再用a + b + c和target比较,从而确定结果集

    for(i = 0; i < numsSize; i++)
    {
        int left = i + 1;
        int right = numsSize - 1;
        while(left < right)
        {
            int sum = nums[i] + nums[left] + nums[right];
            if(sum > 0)
                right--;
            else if(sum < 0)
                left++;
            else
            {
    			//存入数据
            }
        }
    }
    
  • 而在《四数之和》中,由于多了一个数,那么我们就要先确定两个数的值a,b,然后再利用双指针right和left确定另外两个数b,c的值,最后再用四数之和sum和target比较,确定结果集**

    for(int i = 0; i < numsSize; i++)
    {
        for(int j = i + 1; j < numsSize; j++)
        {
            int left = j + 1, right = numsSize - 1;
            while(left < right)
            {
                //为防止溢出,故要做出相应处理
                long long sum = (long long)nums[i] + nums[j] + nums[left] + nums[right];
                if(sum > target)
                    right--;
                else if(sum < target)
                    left++;
                else
                {
                    //存入数据
                }
            }
        }
    }
    
  • 关于去重的处理,和《三数之和》类似,故不再赘述

    for(int i = 0; i < numsSize; i++)
    {
        //a的去重
        if(i > 0 && nums[i] == nums[i - 1])
            continue;
    
        for(int j = i + 1; j < numsSize; j++)
        {
            //b的去重
            if(j > i + 1 && nums[j] == nums[j - 1])
                continue;
    
            int left = j + 1, right = numsSize - 1;
            while(left < right)
            {
                long long sum = (long long)nums[i] + nums[j] + nums[left] + nums[right];
                if(sum > target)
                    right--;
                else if(sum < target)
                    left++;
                else
                {
                    //存入数据
    
                    //c,d的去重
                    while(left < right && nums[left] == nums[++left]);
                    while(left < right && nums[right] == nums[--right]);
    
                }
            }
        }
    }
    

实现代码

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */

//排序算法
void Sort(int *nums, int numsSize)
{
    for(int i = 0; i < numsSize - 1; i++)
    {
        int flag = 0; 
        for(int j = 0; j < numsSize - 1 - i; j++)
        {
            if(nums[j] > nums[j + 1])
            {
                flag = 1;
                int temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
        if(!flag)
            return;
    }
}

int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes){
    //排序
    Sort(nums, numsSize);
    
    //设定最多有100组四元组
    int base = 100;
    
    //分配内存
    int **arr = (int **)malloc(sizeof(int *) * base);
    *returnColumnSizes = (int *)malloc(sizeof(int) * base);
    
    //四元组的初始值为0
    *returnSize = 0;

    for(int i = 0; i < numsSize; i++)
    {
        //如果第一个数就大于target且第一个数大于等于0,那么四数之和肯定大于target,直接break
        if(nums[i] > target && nums[i] >= 0)
            break;
        
        //a的去重
        if(i > 0 && nums[i] == nums[i - 1])
            continue;
        
        for(int j = i + 1; j < numsSize; j++)
        {
            //如果(a + b > target)且(a + b >= 0),那么四数之和肯定大于target,直接break
            if((long long)nums[i] + nums[j] > target && (long long)nums[i] + nums[j] >= 0)
                break;
            
            //b的去重
            if(j > i + 1 && nums[j] == nums[j - 1])
                continue;
            
            int left = j + 1, right = numsSize - 1;
            while(left < right)
            {
                //为防止整形溢出,故要将sum定义为long long
                long long sum = (long long)nums[i] + nums[j] + nums[left] + nums[right];
                
                if(sum > target)
                    right--;
                else if(sum < target)
                    left++;
                else
                {
                    //为存储四元组的数组分配内存
                    arr[*returnSize] = (int *)malloc(sizeof(int) * 4);
                    (*returnColumnSizes)[*returnSize] = 4;
					
                    //存入数据
                    arr[*returnSize][0] = nums[i];
                    arr[*returnSize][1] = nums[j];
                    arr[*returnSize][2] = nums[left];
                    arr[*returnSize][3] = nums[right];
                    
                    //四元组个数加一
                    (*returnSize)++;
					
                    //c,d去重
                    while(left < right && nums[left] == nums[++left]);
                    while(left < right && nums[right] == nums[--right]);

                }
                
                //如果四元组个数达到初始最大值,那就要进行扩容
                if((*returnSize) == base)
                {
                    base *= 2;
                    arr = (int **)realloc(arr,sizeof(int *) * base);
                    *returnColumnSizes = (int *)realloc(*returnColumnSizes,sizeof(int) * base);
                }
            }
        }
    }
    
    //返回存储四元组的二维数组
    return arr;
}

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

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

相关文章

涨点神器:注意力机制---多头上下文集成(Context Aggregation)的广义构建模块,助力小目标检测,暴力涨点

1.数据集性能验证 在crack道路缺陷检测任务中,多头上下文集成(Context Aggregation)的广义构建模块实现暴力涨点mAP50从0.954提升至0.992 🏆🏆🏆🏆🏆🏆Yolov5/Yolov7魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新 🚀🚀🚀…

第一章.The Learning Problem

第一章.The Learning Problem 1.1 The Learning Problem 1.机器学习的概念&#xff1a; 机器学习就是机器从数据中总结经验。从数据中找出某种规律或者模型&#xff0c;并用他来解决某种实际问题。 2.机器学习的应用场景 1).事物本身存在某种潜在规律 2).某些问题难以使用普…

海豚调度器完全设置东八区

为了兼容全世界不同时区&#xff0c;默认情况下&#xff0c;海豚调度器使用的是 UTC 0 时区&#xff0c;包括保存到数据库表中的数据时区&#xff0c;以及展示到页面上的时区。 如果我们想在页面上看到东八区时间&#xff0c;则需要在页面上手动选择上海时区&#xff0c;如下图…

调优圣经:零基础精通Jmeter分布式压测,10Wqps+超高并发

高并发压测的场景 在40岁老架构师尼恩的读者社群&#xff08;50&#xff09;中&#xff0c;很多小伙伴拿不到offer&#xff0c;或者拿不到好的offer。 尼恩经常给大家 优化项目&#xff0c;优化简历&#xff0c;挖掘技术亮点。 在指导简历的过程中&#xff0c; Java 调优是一…

【Vue】一:Vue的基础

文章目录 1.第一个Vue程序1.1 创建Vue实例1.2 将Vue实例挂载到某个位置 2. 模板语句数据来源3. Vue实例的数据对象4. template配置项详解 1.第一个Vue程序 1.1 创建Vue实例 &#xff08;1&#xff09;创建Vue实例 创建一个Vue实例&#xff1a;new Vue() &#xff08;2&#x…

SpringCloud Sentinel集成Gateway和实时监控

目录 1 Sentinel集成Gateway1.1 Sentinel对网关支持1.2 GateWay集成Sentinel 2 Sentinel控制台2.1 Sentinel控制台安装2.2 接入控制台2.3 可视化管理2.3.1 实时监控2.3.2 流控规则2.3.3 降级规则2.3.4 热点数据 1 Sentinel集成Gateway 参看&#xff1a; https://github.com/al…

Linux网络编程——Day12 两种高效的并发模式

今天继续学习高性能服务器框架&#xff0c;上一篇关于高性能服务器的基础知识连接如下&#xff1a; Linux网络编程—Day11 高性能服务器程序框架_Jane_Librastar的博客-CSDN博客https://blog.csdn.net/qq_43797135/article/details/130834354建议先看上一篇哦~ 两种高效的并发…

就业内推 | 京东云专场,IP/NP以上证书,15薪,员工旅游

01 京东云 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1. 整体网络的部署和运维&#xff0c;包括网络新建、扩容、及变更等&#xff1b; 2. 保障网络及相关业务的稳定运行&#xff0c;对问题和故障进行跟踪并最终解决&#xff1b; 3. 与业务部门或客户密切配合&…

网络编程先导知识

目录 1.什么是网络协议 2.什么是Socket Socket主要类型 3.C/S和B/S架构 4.网络字节序和主机字节序 5.局域网和广域网 6.IP地址和端口的概念 1.什么是网络协议 为了在计算机网络中做到有条不紊地交换数据&#xff0c;就必须遵守一些事先约定好的规则。这些规则明确规定了所…

【P30】JMeter 事务控制器(Transaction Controller)

文章目录 一、事务控制器&#xff08;Transaction Controller&#xff09;参数说明二、测试计划设计2.2.1、勾选 Generate parent sample2.2.1、勾选 Include duration of timer and pre-post processors in generated sample 一、事务控制器&#xff08;Transaction Controlle…

Ubuntu22.04安装MySQL8

在 Ubuntu 22.04 上安装 MySQL 8&#xff0c;可以按照以下步骤进行&#xff1a; 安装MySQL需要在root用户下 sudo su -更新软件包列表&#xff1a; sudo apt update安装 MySQL 8&#xff1a; sudo apt install mysql-server安装过程中会提示设置 MySQL root 用户的密码。 确认…

STL-函数对象

目录 一、函数对象 1、基本概念 2、使用 二、谓词 1、基本概念 2、一元谓词 3、二元谓词 三、内建函数对象 1、基本概念 2、算数仿函数 3、关系仿函数 4、逻辑仿函数 一、函数对象 1、基本概念 概念&#xff1a; ①重载函数调用操作符的类&#xff0c;其对象常称…

关于Sql 中 on和where的粗略理解

先看到题&#xff1a;统计复旦用户8月练题情况 牛客中的 原地址 通过这个题我们来探讨where和on 描述 题目&#xff1a; 现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况&#xff0c;请取出相应明细数据&#xff0c;对于在8月份没有练习过的…

【Ansys Fluent】All cell zones in Fluent may be automatically set to Fluid.

一、问题背景 在ansys meshing中保存划分完网格之后的结果时&#xff0c;弹出警报——All cell zones in Fluent may be automatically set to Fluid. 如果你忽视这个警报&#xff0c;打开fluent时。 接着就会将你想要设置为solid的区域识别成flow&#xff0c;从而生成一些错…

docker4_创建容器

docker4_搭建hadoop集群 1集群规划进入容器base_centos 2创建容器创建三个docker容器&#xff0c;分别作为三个结点(注意端口的设置)gpb_hdp_node3 容器gpb_hdp_node2 容器删除容器查看已经创好的容器gpb_hdp_node1容器&#xff08;最后创建&#xff09;问题1:容器名和 hostnam…

代码随想录算法训练营第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数

代码随想录算法训练营第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度&#xff0c;111.二叉树的最小深度&#xff0c;222.完全二叉树的节点个数 1.1 104.二叉树的最大深度 思路&#xff1a; 采用后序遍历确定递归函数的参数和返回值&#xff0c;确定终止条件&#xff…

AJAX 教程---菜鸟教程

文章目录 AJAX 简介AJAX 实例XHR 创建对象XHR 请求向服务器发送请求GET 还是 POST&#xff1f;GET 请求POST 请求url - 服务器上的文件 XHR 响应responseText 属性responseXML 属性 XHR readyState使用回调函数 AJAX 简介 AJAX 是一种在无需重新加载整个网页的情况下&#xff0…

CTR预估之DNN系列模型:FNN/PNN/DeepCrossing

前言 在上一篇文章中 CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM&#xff0c;介绍了FMs系列模型的发展过程&#xff0c;开启了CTR预估系列篇章的学习。FMs模型是由线性项和二阶交互特征组成&#xff0c;虽然有自动学习二阶特征组合的能力&#xff0c;一定程度上避免了人工组合特征…

【Springboot】集成百度地图实现定位打卡功能

目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3.1 环境搭建 3.1.1 获取百度地图ak 3.1.2 创建springboot项目 3.2 配置application.properties 3.3 配置pox.xml 3.4 创建定位接口 3.5 创建前端页面 3.6 映射静态文件 第一章 需求分析 如图&#xff0c;当…

BERT论文核心点记录

BERT适合分类任务&#xff08;整段分类后者词分类&#xff09;&#xff0c;对生成任务不友好 使用BERT的方法&#xff1a;只需要在预训练好的BERT基础上新增一个输出层&#xff0c;然后用标记好的数据进行有监督微调 Bidirectional Encoder双向Encoder实质上就是指Transforme…