力扣网C语言编程题:三数之和

一. 简介

本文记录力扣网上的逻辑编程题,涉及数组方面的,这里记录一下 C语言实现和Python实现。

二. 力扣网C语言编程题:三数之和

题目:三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:
    3 <= nums.length <= 3000
    -105 <= nums[i] <= 105

解题思路:

根据题目要求,数组中找到三个元素之和为0,且不重复的三元组。这里解决不重复的方法就是排序,排序后查重就可以保证不重复。

固定一个元素,使用双指针,从数组的头部与尾部进行同时进行查找,查找第二元素和第三个元素。

具体方法:

1. 从小到大进行排序;

2. 遍历数组,元素去重;

3. 开始从数组首部和尾部开始同时进行,统计三个元素为 0的元素,如果和小于0,则移动左指针。如果大于0则移动右指针。如果等于0则保存数据,然后对左边指针的元素进行查重,右边指针的元素进行查重;

C语言实现如下:

#include <stdio.h>//从小到大排序
int compare_data(const void* a, const void* b) {return *(int*)a -*(int*)b;
}/*** 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** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {if((nums == NULL) || (numsSize <= 0) || (returnSize == NULL) || (returnColumnSizes == NULL)) {return NULL;}*returnSize = 0;int left = 0;int right = 0;int i = 0; //分配返回数组的缓存int** ret_data = (int**)malloc(10*numsSize * sizeof(int*));*returnColumnSizes = (int*)malloc(10*numsSize * sizeof(int));//从小到大排序qsort(nums, numsSize, sizeof(int), compare_data);//遍历数组(从头部和尾部同时)for(i = 0; i < (numsSize-2); i++) {//当前元素大于0,那么更不可能存在sum值等于0的数了,结束遍历if(nums[i] > 0) {break;}//元素去重(当前元素与上一次元素相等,跳过此次计算)if(i > 0 && nums[i] == nums[i-1]) {continue;}left = i+1;right = numsSize-1;//开始查找三数之和while(left < right) {//判断和的值int sum = nums[i] + nums[left] + nums[right];if(sum == 0) { //分配内存,保存结果ret_data[*returnSize] = (int*)malloc(3 * sizeof(int));ret_data[*returnSize][0] = nums[i];ret_data[*returnSize][1] = nums[left];ret_data[*returnSize][2] = nums[right];(*returnColumnSizes)[*returnSize] = 3; //返回数组当前行的列数为3(*returnSize)++; //三元组的个数//左边指针的元素进行查重while((left < right) && (nums[left] == nums[++left]));//右边指针的元素进行查重while((left < right) && (nums[right] == nums[--right]));}else if(sum < 0) { //左指针向右移找大值left++;}else { //右指针向左移找小值right--;}  }}return ret_data;
}

Python实现如下:


class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:ret = []n = len(nums)#从小到大进行排序,方便去重nums.sort()#遍历数组元素(从数组的首部和尾部同时进行)#0 ~ n-3for i in range(0, n-2):#如果第一个元素大于0,则不必查找了(后面元素更大)if(nums[i] > 0):break#元素查重(如果当前元素与上一次元素相等,则跳过这次计算)if(i > 0 and nums[i] == nums[i-1]):continueleft = i + 1right = n - 1#查找和为0的三元组while(left < right):sum = nums[i] + nums[left] + nums[right] #和 == 0if(sum == 0):ret.append([nums[i], nums[left], nums[right]])#左右指针的元素查重while(left < right and nums[left] == nums[left+1]):left += 1while(left < right and nums[right] == nums[right-1]):right -= 1left += 1right -= 1#和 < 0,则左指针向右移(说明和小了,需要和增大)elif(sum < 0): left += 1#和 > 0,则右指针向左移(说明和大了,需要和减小)else:right -= 1return ret

第一次写 Python,是与 C语言有区别。好像写起来也没想象中困难,加油!

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

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

相关文章

2.2 Windows MSYS2编译FFmpeg 4.4.1

一、安装编译工具 # 更换pacman源 sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist* pacman -Sy# 安装依赖 pacman -S --needed base-devel mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-ya…

驱动开发,队列,环形缓冲区:以GD32 CAN 消息处理为例

对环形缓冲区进行进一步的优化和功能扩展&#xff0c;以应对更复杂的实际应用场景&#xff0c;特别是针对 CAN 总线消息处理的场景。 一、优化点 1&#xff1a;动态配置环形缓冲区大小在原始实现中&#xff0c;我们固定了缓冲区大小为 RINGBUFF_LEN 64。这种方式虽然简单&am…

SQL基础知识,MySQL学习(长期更新)

1、基本操作&#xff0c;增删查改 INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...); DELETE FROM 表名 WHERE 条件 SELECT * FROM 表名 WHERE 条件 UPDATE 表名 SET 字段1 值, 字段2 值, ... WHERE 条件; SELECT * INTO 新表 FROM 旧表 WHERE… INSERT INTO 语…

Git(一):初识Git

文章目录 Git(一)&#xff1a;初识GitGit简介核心功能分布式特性结构与操作优势与适用场景 创建本地仓库git init配置name与email--global 工作区、暂存区与版本库git addgit commitcommit后.git的变化 Git(一)&#xff1a;初识Git Git简介 Git 是一个分布式版本控制系统&…

第19天:初级数据库学习笔记3

分组函数&#xff08;多行处理函数&#xff09; 即多个输入对应一个输出。前面讲的数据处理函数是单行处理函数。&#xff08;在公司中常说单&#xff0c;多行处理函数&#xff09; 分组函数包括五个&#xff1a; max&#xff1a;最大值min&#xff1a;最小值avg&#xff1a…

Windows11下搭建Raspberry Pi Pico编译环境

1. 系统与工具要求 PC平台&#xff1a; Windows 11 专业版 Windows GCC: gcc-15.1.0-64.exe GNU Make: 4.3 Git: 2.49.0 cmake: 4.0.2 python:3.12.11 Arm GNU Toolchain Downloads – Arm Developer 2. 工具安装与验证 2.1 工具安装 winget安装依赖工具&#xff08;Windows …

【C语言极简自学笔记】重讲运算符

一、算术操作符 算术操作符描述把两个操作数相加-第一个操作数减去第二个操作数*把两个操作数相乘/分子除以分母%取模运算符&#xff0c;整除后的余数 注意&#xff1a;1.除号的两端都是整数的时候执行的是整数的除法&#xff0c;两端只要有一个浮点数&#xff0c;就执行浮点…

持续集成 CI/CD-Jenkins持续集成GitLab项目打包docker镜像推送k8s集群并部署至rancher

Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 之前是通过jar包在shell服务器上进行手动部署&#xff0c;麻烦且耗时。现通过Jenkins进行持续集成实现CI/CD。以test分支为例 提交即部署。 由于是根据自己实际使用过程 具体使用到了 gitlabjenkinsdockerharborra…

Apache Iceberg与Hive集成:非分区表篇

引言 在大数据处理领域&#xff0c;Apache Iceberg凭借其先进的表格式设计&#xff0c;为大规模数据分析带来了新的可能。当Iceberg与Hive集成时&#xff0c;这种强强联合为数据管理与分析流程提供了更高的灵活性和效率。本文将聚焦于Iceberg与Hive集成中的非分区表场景&#…

webpack 如何区分开发环境和生产环境

第一种方法: 方法出处&#xff1a;命令行接口&#xff08;CLI&#xff09; | webpack 中文文档 1.利用webpack.config.js 返回的是个函数&#xff0c;利用函数的参数&#xff0c;来区分环境 具体步骤 1&#xff09; package.json文件&#xff1a;在npm scripts 命令后面追加 …

React组件通信——context(提供者/消费者)

Context 是 React 提供的一种组件间通信方式&#xff0c;主要用于解决跨层级组件 props 传递的问题。它允许数据在组件树中"跨级"传递&#xff0c;无需显式地通过每一层 props 向下传递。 一、Context 核心概念 1. 基本组成 React.createContext&#xff1a;创建 C…

“微信短剧小程序开发指南:从架构设计到上线“

1. 引言&#xff1a;短剧市场的机遇与挑战 近年来&#xff0c;短视频和微短剧市场呈现爆发式增长&#xff0c;用户碎片化娱乐需求激增。短剧小程序凭借轻量化、社交传播快、变现能力强等特点&#xff0c;成为内容创业的新风口。然而&#xff0c;开发一个稳定、流畅且具备商业价…

RPC与RESTful对比:两种API设计风格的核心差异与实践选择

# RPC与RESTful对比&#xff1a;两种API设计风格的核心差异与实践选择 ## 一、架构哲学与设计目标差异 1. **RPC&#xff08;Remote Procedure Call&#xff09;** - **核心思想**&#xff1a;将远程服务调用伪装成本地方法调用&#xff08;方法导向&#xff09; - 典型行为…

【pytest进阶】pytest之钩子函数

什么是 hook (钩子)函数 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么? what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西…

深度学习计算——动手学深度学习5

环境&#xff1a;PyCharm python3.8 1. 层和块 块&#xff08;block&#xff09;可以描述 单个层、由多个层组成的组件或整个模型本身。 使用块进行抽象的好处&#xff1a; 可将块组合成更大的组件(这一过程通常是递归) 如 图5.1.1所示。通过定义代码来按需生成任意复杂度…

NodeJS的fs模块的readFile和createReadStream区别以及常见方法

Node.js 本身没有像 Java 那样严格区分字符流和字节流&#xff0c;区别主要靠编码&#xff08;encoding&#xff09;来控制数据是以 Buffer&#xff08;二进制字节&#xff09;形式还是字符串&#xff08;字符&#xff09;形式处理。 详细解释&#xff1a; 方面JavaNode.js字节…

基于二进制XOR运算的机器人运动轨迹与对称图像自动生成算法

原创&#xff1a;项道德&#xff08;daode3056,daode1212&#xff09; 新的算法出现&#xff0c;往往能给某些行业与产业带来革命与突破。为探索机器人运动轨迹与对称图像自动生成算法&#xff0c;本人已经通过18种算法的测试&#xff0c;最终&#xff0c;以二进制的XOR运算为…

Spring AI 项目实战(七):Spring Boot + Spring AI Tools + DeepSeek 智能工具平台(附完整源码)

系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4Spring AI 项目实战(四…

spring-webmvc @RequestHeader 典型用法

典型用法 基础用法&#xff1a;获取指定请求头值 GetMapping("/info") public String getInfo(RequestHeader("User-Agent") String userAgent) {return "User-Agent: " userAgent; }如果请求中包含 User-Agent 请求头&#xff0c;则其值将被…

Ubuntu:20.04中安装docker

是的&#xff0c;您列出的命令是完整的安装步骤&#xff0c;但为了确保100%可靠性和处理可能的问题&#xff0c;我建议进行以下优化和补充&#xff1a; 完整优化的安装脚本&#xff08;包含错误处理和验证&#xff09; #!/bin/bash# 1. 彻底清理旧版本和配置 sudo apt remove…