当前位置: 首页 > news >正文

LeetCode18四数之和

在这里插入图片描述

代码来源:代码随想录

/**
 * 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().
 */
int compare(const void *a,const void *b)
{
    int a1=*(int *)a;
    int b1=*(int *)b;
    return (a1>b1)-(a1<b1);
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes)
{
    //1.对数组进行排序
    qsort(nums,numsSize,sizeof(int),compare);
    //2.分配空间,解的数量上限是C(200 4),但经验值为40000,避免过度分配内存
    int **result=(int **)malloc(sizeof(int *)*40000);
    int count=0;//计数器,记录解的数量
    for(int i=0;i<numsSize-3;i++)
    {
        /* 剪枝:如果nums[i]已经大于target且为正数,后面不可能有解 */
        if ((nums[i] > target) && (nums[i] >= 0)) {
            break;
        }
        /* 去重:跳过重复的nums[i] */
        if ((i > 0) && (nums[i] == nums[i - 1])) {
            continue;
        }
        for(int j=i+1;j<numsSize-2;j++)
        {
            /* 剪枝:如果前两数之和已经大于target且nums[j]为正数 */
            if ((nums[i] + nums[j] > target) && (nums[j] >= 0)) {
                break;
            }
            /* 去重:跳过重复的nums[i] */
            if ((j > (i + 1)) && (nums[j] == nums[j - 1])) {
                continue;
            }
            //左指针
            int left=j+1;
            //右指针
            int 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
                {
                    //3.找到符合条件的四元组记录到result中
                    int *result_tmp=(int *)malloc(sizeof(int)*4);
                    result_tmp[0]=nums[i];
                    result_tmp[1]=nums[j];
                    result_tmp[2]=nums[left];
                    result_tmp[3]=nums[right];
                    result[count++]=result_tmp;
                    //去重,去掉重复的left和right
                    while ((right > left) && (nums[right] == nums[right - 1])) {
                        right--;
                    }
                    while ((left < right) && (nums[left] == nums[left + 1])) {
                        left++;
                    }
                    right--;
                    left++;
                }
            }
        }
    }
    *returnSize=count;
    int *column=(int *)malloc(sizeof(int)*count);
    for(int i=0;i<count;i++)
    {
        column[i]=4;
    }
    *returnColumnSizes=column;
    return result;
}

相关文章:

  • 【Redis】数据的淘汰策略
  • linux磁盘创建分区
  • 开源协议指南:主流许可证核心区别解析
  • 基于javaweb的SpringBoot汉服文化bbs系统设计与实现(源码+文档+部署讲解)
  • “Pseudo Global Warming”:伪全球变暖PGW
  • Diffusion-Based Planning for Autonomous Driving with Flexible Guidance论文细读
  • 【奇点时刻】GPT4o新图像生成模型底层原理深度洞察报告
  • 【Leetcode 994】腐烂的橘子 - 多源 BFS 解题思路与 Java 实现详解
  • Master节点重启k8s集群崩溃解决办法
  • AGI大模型(10):prompt逆向-巧借prompt
  • Windows 系统下安装 Docker
  • 构建网络 练习题三道
  • idea快捷键 Spring endpoint actions in the editor
  • Vue自定义指令最佳实践教程
  • 2022年蓝桥杯第十三届CC++大学B组真题及代码
  • Jmeter如何使用MD5进行加密?
  • 界面控件DevExpress WPF v25.1新功能预览 - AI功能增强
  • 大厂算法面试 7 天冲刺:第6天-树与图深度剖析——高频算法面试题 Java 实战
  • oracle WAIT 和 NOWAIT
  • 基于开源链动 2+1 模式 AI 智能名片 S2B2C 商城小程序的社群团购品牌命名策略研究
  • 北京网站制作网络推广公司/中国十大互联网公司
  • dw如何做网站/关键词异地排名查询
  • 第9区在线观看完整版/seo外贸公司推广
  • 适合权重小的网站做的专题/辅导班培训机构
  • 校园网站建设的感受论文/百度网盘官网登陆入口
  • 网络管理中心网站/广州网络推广专员