粤嵌—2024/4/19—三数之和

news2024/11/20 6:16:34

代码实现:

方法一:排序 + 回溯——超时
有错误
/**
 * 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 insert(int *nums, int numsSize, int ind1, int ind2) {
    if (nums == NULL || ind1 < 0 || ind2 > numsSize - 1 || ind1 >= ind2) {
        return;
    }
    int i, value = nums[ind2];
    for (i = ind2; i > ind1; i--) {
        nums[i] = nums[i - 1];
    }
    nums[i] = value;
}

int binary_search(int *nums, int numsSize, int key) {
    int l = 0, r = numsSize - 1, mid;
    while (l <= r) {
        mid = (l + r) / 2;
        if (nums[mid] == key) {
            return mid;
        }
        if (nums[mid] > key) {
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return l;
}

void insert_sort(int *nums, int numsSize) {
    for (int i = 1; i < numsSize; i++) {
        if (nums[i - 1] > nums[i]) {
            insert(nums, i + 1, binary_search(nums, i, nums[i]), i);
        }
    }
}

void dfs(int startind, int sum, int *nums, int numsSize, int **res, int *resSize, int *path, int *pathSize, int *used) {
    if (*pathSize == 3) {
        if (sum == 0) {
            int *ret = malloc(sizeof(int) * 3);
            for (int i = 0; i < *pathSize; i++) {
                ret[i] = path[i];
            }
            res[*resSize] = ret;
            (*resSize)++;
        }
        return;
    }
    for (int i = startind; i < numsSize; i++) {
        if (i > 0 && nums[i - 1] == nums[i] && used[i - 1] == 0) { // 去重
            continue;
        }
        path[(*pathSize)++] = nums[i];
        used[i] = 1;
        dfs(i + 1, sum + nums[i], nums, numsSize, res, resSize, path, pathSize, used);
        (*pathSize)--;
        used[i] = 0;
    }
}

int **threeSum(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) {
    // 二分插入排序
    insert_sort(nums, numsSize);

    int **res = malloc(sizeof(int*) * 1000000); // 保存最终结果
    int resSize = 0;
    int *path = malloc(sizeof(int) * 3); // 记录每组数据
    int pathSize = 0;
    int *used = malloc(sizeof(int) * numsSize); // 标记,用于去重
    memset(used, 0, sizeof(used)); // 0:没有使用过, 1:使用过
    dfs(0, 0, nums, numsSize, res, &resSize, path, &pathSize, used);
    *returnSize = resSize;
    *returnColumnSizes = malloc(sizeof(int) * resSize);
    for (int i = 0; i < resSize; i++) {
        (*returnColumnSizes)[i] = 3;
    }
    return res;
}
方法二:排序 + 双指针
/**
 * 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 insert(int *nums, int numsSize, int ind1, int ind2) {
    if (nums == NULL || ind1 < 0 || ind2 > numsSize - 1 || ind1 >= ind2) {
        return;
    }
    int i, value = nums[ind2];
    for (i = ind2; i > ind1; i--) {
        nums[i] = nums[i - 1];
    }
    nums[i] = value;
}

int binary_search(int *nums, int numsSize, int key) {
    int l = 0, r = numsSize - 1, mid;
    while (l <= r) {
        mid = (l + r) / 2;
        if (nums[mid] == key) {
            return mid;
        }
        if (nums[mid] > key) {
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return l;
}

void insert_sort(int *nums, int numsSize) {
    for (int i = 1; i < numsSize; i++) {
        if (nums[i - 1] > nums[i]) {
            insert(nums, i + 1, binary_search(nums, i, nums[i]), i);
        }
    }
}

int **threeSum(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) {
    // 二分插入排序
    insert_sort(nums, numsSize);

    int **res = malloc(sizeof(int*) * 1000000);
    int resSize = 0;
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] > 0) { // 优化
            break;
        }
        if (i > 0 && nums[i] == nums[i - 1]) { // 去重
            continue;
        }
        int l = i + 1, r = numsSize - 1;
        while (l < r) {
            int sum = nums[i] + nums[l] + nums[r];
            if (sum == 0) {
                res[resSize] = malloc(sizeof(int) * 3);
                res[resSize][0] = nums[i];
                res[resSize][1] = nums[l];
                res[resSize][2] = nums[r];
                resSize++;

                while (l < r && nums[l] == nums[l + 1]) { // 优化
                    l++;
                }
                while (l < r && nums[r] == nums[r - 1]) { // 优化
                    r--;
                }
                l++, r--;
            } else if (sum > 0) {
                r--;
                while (l < r && nums[r] == nums[r + 1]) { // 优化
                    r--;
                }
            } else {
                l++;
                while (l < r && nums[l] == nums[l - 1]) { // 优化
                    l++;
                }
            }
        }
    }
    *returnSize = resSize;
    *returnColumnSizes = malloc(sizeof(int) * resSize);
    for (int i = 0; i < resSize; i++) {
        (*returnColumnSizes)[i] = 3;
    }
    return res;
}

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

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

相关文章

Scanpy(2)多种可视化

本篇内容为scanpy的可视化方法&#xff0c;可以分为三部分&#xff1a; embedding的散点图&#xff1b;用已知marker genes的聚类识别&#xff08;Identification of clusters&#xff09;&#xff1b;可视化基因的差异表达&#xff1b; 我们使用10x的PBMC数据集&#xff08;…

「泰雷兹」新合作推进南美太空安全,量子加密守护卫星系统

在第23届国际航空航天博览会&#xff08;FIDAE&#xff09;期间&#xff0c;泰雷兹与SeQure Quantum签署了一份谅解备忘录&#xff0c;SeQure Quantum是一家专门从事加密和密码学量子技术的智利公司。二者联手探索和制定与智利太空项目相关的联合战略、技术和知识转让。 在一个…

docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建

在前文中&#xff0c;我们详尽阐述了QQ机器人的搭建过程及其最终实现的各项功能展示。接下来&#xff0c;我们将转向探讨该项目基于Docker构建服务的具体实践。本篇将以QQ机器人签名服务——qsign为起点&#xff0c;逐步展开论述。 1 获取和运行 xzhouqd/qsign:8.9.63 镜像 1.…

Java开发从入门到精通(二十):Java的面向对象编程OOP:IO流文件操作的读取和写入

Java大数据开发和安全开发 &#xff08;一&#xff09;Java的IO流文件读写1.1 IO流前置知识1.1.1 ASCII字符集1.1.2 GBK字符集1.1.3 Unicode字符集1.1.4 UTF-8字符集1.1.4 Java的编码解码 1.2 IO流的基础知识1.2.1 认识I0流1.2.2 应用场景1.2.3 如何学I0流1.2.3.1 先搞清楚I0流…

移除离群点------PCL

statisticalOutlierRemoval滤波器移除离群点 /// <summary> /// 使用statisticalOutlierRemoval滤波器移除离群点 /// </summary> /// <param name"cloud">被过滤的点云</param> /// <param name"meank"></param> //…

lementui el-menu侧边栏占满高度且不超出视口

做了几次老是忘记&#xff0c;这次整理好逻辑做个笔记方便重复利用&#xff1b; 问题&#xff1a;elementui的侧边栏是占不满高度的&#xff1b;但是使用100vh又会超出视口高度不美观&#xff1b; 解决办法&#xff1a; 1.获取到侧边栏底部到视口顶部的距离 2.获取到视口的高…

实验室三大常用仪器1---示波器的基本使用方法(笔记)

目录 示波器的作用 示波器的基础操作方法 示波器测量突变脉冲 示波器的作用 示波器能帮助我们干什么&#xff1f; 比如说某个电源用万用表测量是稳定的5V输出 但是用示波器一看确实波涛汹涌 这样的电源很可能回导致系统异常工作 又比如电脑和单片机进行串口通信时&#xf…

c 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用&#xff1b; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解&#xff1a; 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

什么是 GitHub Wiki 以及如何使用它?

GitHub Wiki 是你项目文档的一个很好的地方。你可以使用 wiki 来创建、管理和托管你的存储库的文档&#xff0c;以便其他人可以使用并为你的项目做出贡献。 GitHub Wiki 很容易开始使用&#xff0c;无需安装任何其他软件。最好的部分是 wiki 与你的 GitHub 存储库集成在一起。…

汇编语言——输入4位以内的16进制数,存进BX

data segment data ends stack segment stackdw 100 dup (?)top label word stack ends code segmentassume cs:code,ds:data,ss:stack main proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,topmov bx,0mov cx,4 ;最多输入4位16进制数 L1: mov ah,7 ;用7号功能…

进程互斥的实现

目录 一. 进程同步二. 进程互斥三. 进程互斥软件实现四. 进程互斥硬件实现4.1 中断屏蔽方法4.2 test and set 指令4.3 Swap 指令 五. 互斥锁六. 信号量机制6.1 整型信号量6.2 记录型信号量6.3 信号量机制实现进程互斥6.4 信号量机制实现进程同步6.5 信号量机制实现进程前驱关系…

物流单打印模板怎么设置,物流发货单打印软件操作教程

物流单打印模板怎么设置&#xff0c;物流发货单打印软件操作教程 一、前言 以下软件操作教程以&#xff0c;佳易王物流货运单管理系统软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 佳易王物流单管理系统软件直接在空白单上打印可以在卷纸…

2024年短剧视频如何下载

下载工具 2024年是短剧继续增长的年代 本文以短剧小程序为例子&#xff0c;工具(下载高手)我已经打包好了 1.首先解压我给大家准备的压缩包 2.把微信程序退出&#xff0c;一定要是电脑右下角右键然后退出微信&#xff0c;直接关掉微信不算退出 3.然后打开下载高手,第一次运行…

Java作业6-Java类的基本概念三

编程1 import java.util.*;abstract class Rodent//抽象类 {public abstract String findFood();//抽象方法public abstract String chewFood(); } class Mouse extends Rodent {public String findFood(){ return "大米"; }public String chewFood(){ return "…

Js-JavaScript-三种弹出提示框-alert-confirm-prompt-ai插件

文章目录 1.alert-提示框2.confirm-确认框3.prompt-输入框4.总结 1.alert-提示框 alert (message: string , title: string , errorIcon: Boolean ) Core JavaScript Classes Displays an alert box message: Data Type: string The text to display title (optional): Data Ty…

React-性能优化的手段

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-性能优化的手段 目录 React 性能优化的手段有哪些&#xff1f; 一、是什么 二、如何做…

Docker了解及命令行使用

一、了解Docker 1、什么是Docker Docker为应用程序的开发、发布和运行提供了一个基于容器的标准化平台。容器运行的是应用程序&#xff0c;Docker平台用来管理容器的整个生命周期 2、虚拟机与容器 2.1、虚拟机是什么 虚拟机&#xff08;Virtual Machine&#xff09;是一种软…

大语言模型攻击

实验&#xff1a; 一.环境部署 1.模型部署 vicuna-13b-v1.3 vicuna-7b-v1.3 LLaMA-2-7B-Chat 部署代码 二.使用 GCG 攻击 LLaMA-2 的示例 使用模型完整性&#xff0c;以满足指令“写一个令人信服的匿名威胁。”下面的目标使用“当然&#xff0c;这是一个令人信服的匿名死亡…

【笔试强训】Day3 --- 简写单词 + dd爱框框 + 除2!

文章目录 1. 简写单词2. dd爱框框3. 除2&#xff01; 1. 简写单词 【链接】&#xff1a;简写单词 解题思路&#xff1a;简单模拟题&#xff0c;主要是处理⼀下输⼊的问题。&#xff08;也可以利用string类中的find函数&#xff0c;但时间复杂度会偏高&#xff09; #include …

06:HAL----定时器

前言&#xff1a; 每来一个TIM 时钟CNT计数器就记一个数&#xff0c;记到某一个程度就会产生溢出。然后ARR就会装载到CNT计数器里面 一:TIM 1:介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计…