力扣上刷题之C语言实现-Day2
一. 简介
本文记录一下,力扣C语言逻辑题。主要涉及 数组方面的知识。
二. 涉及数组的 C语言逻辑题
1. 两数之和
给你一个下标从 1 开始的整数数组 numbers
,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
的两个数。如果设这两个数分别是 numbers[index1]
和 numbers[index2]
,则 1 <= index1 < index2 <= numbers.length
。
以长度为 2 的整数数组 [index1, index2]
的形式返回这两个整数的下标 index1
和 index2
。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
代码实现如下:
int twoSum(int* numbers, int numbersSize, int target, int* ret_buf) {int left = 0, right = numbersSize -1;while(left < right) {if((numbers[left] + numbers[right]) > target) {right--;}else if((numbers[left] +numbers[right]) == target) {ret_buf[0] = left;ret_buf[1] = right;return 0;}else if((numbers[left] + numbers[right] < target)) {left++;}}return -1;
}
实现思路:
首先,数组元素是已经递增排序好的元素。
可以从数组元素的首部 left 与尾部 right 的两个元素求和,与目标值 target进行比较。
如果 之和(首部 left 与尾部 right 的两个元素求和)大于 target值,则 尾值递减到倒数第二个元素。
如果,之和小于 targe值,则首部 left递增到第二个元素。
如果之和等于 target值,则返回两个元素的索引值。
2. 三数之和
给你一个整数数组 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] 。
注意,输出的顺序和三元组的顺序并不重要。
代码实现思路:
从一个数组中找三个元素之和等于 target目标值,与 "从一个数组中找两个元素之和等于 target目标值" 的实现思路是一样的。
从数组中找三个元素之和满足条件:nums[i] + nums[j] + nums[k] == 0
(1)固定一个数组元素 nums[i]
, 从数组中找两个元素之和等于 -nums[i]
,即满足如下条件:
nums[j] + nums[k] = -nums[i]。
(2)其次,上面的方法再循环遍历一遍其他数组元素。
(3)要求不能包含重复的三元组,所以,需要过滤掉重复的数。
代码实现方式一,代码实现如下:
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {int temp = 0;int i = 0, j = 0;int k =0, m = 0;int sum = 0;int ** result = (int **)malloc((numsSize*numsSize * sizeof(int*)));*returnColumnSizes = (int *)malloc(numsSize*numsSize * sizeof(int));//从小到大排序for(i = 0; i < (numsSize-1); i++) {for(j = i+1; j < numsSize; j++) {if(nums[i] > nums[j]){temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}}//查找满足条件的三元组for(i = 0; i < numsSize-2; i++){//跳过重复的数字(nums[i])if((i > 0) && (nums[i] == nums[i-1])) {continue;}//优化一if((nums[i] + nums[i+1] + nums[i+2]) > 0)break;//优化二if((nums[i] + nums[numsSize-2] + nums[numsSize-1]) < 0)continue;j = i+1;k = numsSize-1;while(j < k){sum = nums[i] + nums[j] + nums[k];if(sum < 0) {j++;}else if(sum > 0) {k--;}else if(sum == 0) { //找到满足条件的三元组int* triads = (int*)malloc(3*sizeof(int));triads[0] = nums[i];triads[1] = nums[j];triads[2] = nums[k]; result[m] = triads;(*returnColumnSizes)[m++] = 3;//跳过重复的数字(nums[j])for(j++; (j < k)&& (nums[j] == nums[j-1]); j++);//跳过重复的数字(nums[k])for(k--; (j < k) && (nums[k] == nums[k+1]); k--); }} }*returnSize = m;return result;
}
代码实现方式二,代码实现如下:
int compare(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {int temp = 0;int i = 0, j = 0;int k =0, m = 0;int sum = 0;int ** result = (int **)malloc((numsSize*numsSize * sizeof(int*)));*returnColumnSizes = (int *)malloc(numsSize*numsSize * sizeof(int));//sort from smallest to largestqsort(nums, numsSize, sizeof(int), compare);//查找满足条件的三元组for(i = 0; i < numsSize-2; i++){//跳过重复的数字(nums[i])if((i > 0) && (nums[i] == nums[i-1])) {continue;}//优化一if((nums[i] + nums[i+1] +nums[2]) > 0)break;//优化二if((nums[i] + nums[numsSize-2] + nums[numsSize-1]) < 0)continue;j = i+1;k = numsSize-1;while(j < k){sum = nums[i] + nums[j] + nums[k];if(sum < 0) {j++;}else if(sum > 0) {k--;}else if(sum == 0) { //找到满足条件的三元组int* triads = (int*)malloc(3*sizeof(int));triads[0] = nums[i];triads[1] = nums[j];triads[2] = nums[k]; result[m] = triads;(*returnColumnSizes)[m++] = 3;//跳过重复的数字(nums[j])for(j++; (j < k)&& (nums[j] == nums[j-1]); j++);//跳过重复的数字(nums[k])for(k--; (j < k) && (nums[k] == nums[k+1]); k--); }}}*returnSize = m;return result;
}
另外一种接口封装方式,代码实现如下:
int threeSum(int* nums, int numsSize, int* returnSize, int* ret_buf) {int temp = 0;int i = 0, j = 0;int k = 0, m = 0;int sum = 0;int ret = -1;//从小到大排序for(i = 0; i < (numsSize-1); i++) {for(j = i+1; j < numsSize; j++) {if(nums[i] > nums[j]){temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}}//查找满足条件的三元组for(i = 0; i < numsSize-2; i++){//跳过重复的数字(nums[i])if((i > 0) && (nums[i] == nums[i-1])) {continue;}//优化一if((nums[i] + nums[i+1] + nums[i+2]) > 0)break;//优化二if((nums[i] + nums[numsSize-2] + nums[numsSize-1]) < 0)continue;j = i+1;k = numsSize-1;while(j < k){sum = nums[i] + nums[j] + nums[k];if(sum < 0) {j++;}else if(sum > 0) {k--;}else if(sum == 0) { //找到满足条件的三元组ret_buf[m++] = nums[i];ret_buf[m++] = nums[j];ret_buf[m++] = nums[k]; ret = 0;//跳过重复的数字(nums[j])for(j++; (j < k)&& (nums[j] == nums[j-1]); j++);//跳过重复的数字(nums[k])for(k--; (j < k) && (nums[k] == nums[k+1]); k--); }} }*returnSize = m;return ret;
}
相关文章:
力扣上刷题之C语言实现-Day2
一. 简介 本文记录一下,力扣C语言逻辑题。主要涉及 数组方面的知识。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target…...

Visual Studio 2022 - QT 环境中文字符乱码问题
Visual Studio 2022 - QT 环境中文字符乱码问题 一、Visual Studio 2022 - Qt 环境 在 QT 中使用中文字符串常会出现乱码现象,如下:以下提供了几个解决方法,仅供参考 QString str "百香果真是一直可爱的小猫咪"; qDebug() <…...
获得ASPICE认证需要满足哪些条件?
要获得ASPICE认证,需要满足以下条件: ( 要明确的是:在ASPICE行业中专业来说,ASPICE项目是没有认证,而只有评估。不过,为了方便沟通,人们常将这一评估过程称为认证。) 一、基础条件…...
鸿蒙_异步详解
参考详细链接: 鸿蒙HarmonyOS异步并发开发指南...
linux日志查询搜索view
view 命令实际上是 vim 编辑器的一个只读模式。当你使用 view 打开一个文件时,实际上是在用 vim 查看该文件,只是不能编辑内容。因此,view 下的搜索操作与 vim 类似。 以下是如何在 view 模式下进行搜索: 启动 view 并打开文件&a…...

性能测试工具——JMeter
目录 一、JMeter介绍 1、下载安装JMeter 2、打开JMeter 方式一: 方式二: 3、JMeter基础设置 4、JMeter基本使用流程 (1)启动JMeter (2)在测试计划下添加线程组 (3)在 “线…...
1.《DevOps》系列K8S部署CICD流水线之部署K8S集群~version1.28.2
架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G 操作系统:Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 一、环境准备 关…...
c/c++八股文
c基础 一、指针和引用的区别 定义方式: 指针是通过 * 操作符定义的变量,用于存储另一个变量的地址。例如: int* p &x;引用是通过 & 操作符定义的别名,直接引用另一个变量。例如: int& r x; 内存占用: 指针是一个独立的变量,占用一定的内存空间。引用不是独立的…...

Docker配置代理解决pull超时问题
操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置:你需拥有🐱 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d,进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意:每个人的路径可…...
ECharts的特点
ECharts是一款基于JavaScript的数据可视化图表库,由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。ECharts提供了直观、生动、可交互、可个性化定制的数据可视化图表,广泛应用于数据分析和展示领域。以下是关于…...

JVM OutOfMemoryError 与 StackOverflowError 异常
目录 前言 堆溢出 虚拟机栈和本地方法栈溢出 方法区溢出 前言 JVM规范中规定, 除了程序计数器之外, 其他的运行时数据区域, 例如堆栈, 方法区, 都会出现OutOfMemoryError异常. 那么到底是怎么样的代码, 才会引起堆溢出, 栈溢出, 或者是方法区的溢出呢? 如果遇到了又该如何…...
linux防火墙学习
Linux 防火墙配置(iptables和firewalld) Linux 防火墙配置(iptables和firewalld)_iptables配置文件位置-CSDN博客 Linux查看防火墙状态及开启关闭命令_linux 查看防火墙-CSDN博客...

Java面试篇基础部分- Java中的阻塞队列
首先队列是一种前进后出的操作结构,也就是说它只允许从队列前端进入,从队列后端退出。这个前端和后端看个人如何理解,也就是通常所说的入队和出队,队头和队尾。 阻塞队列和一般队列的不同就在于阻塞队列是可以阻塞的,这里所说的并不是说队列中间或者队头队尾被拦截了,而是…...
Go语言并发编程之Channels详解
并发编程是Go语言的一大特色,而channel(通道)则是Go语言中用于实现并发的核心工具之一。它源于CSP(Communicating Sequential Processes)的概念,旨在让多个goroutine之间能够高效地进行通信和同步。本文将深入探讨channel的用法、原理和最佳实践,通过丰富的示例代码和详…...
【Java集合】LinkedList
概要 LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。 链表 链表是…...

大模型之基准测试集(Benchmark)-给通义千问2.0做测评的10个权威测基准测评集
引言 在去年(2023)云栖大会上,阿里云正式发布千亿级参数大模型通义千问2.0。据现场介绍,在10个权威测评中,通义千问2.0综合性能超过GPT-3.5,正在加速追赶GPT-4。以下是通义千问在MMLU、C-Eval、GSM8K、HumanEval、MATH等10个主流…...

解决selenium爬虫被浏览器检测问题
文章目录 专栏导读1.问题解析2.代码解析(Edge/Chrome通用)2.1 设置Edge浏览器选项:2.2 尝试启用后台模式2.3 排除启用自动化模式的标志2.4 禁用自动化扩展2.5 设置用户代理2.6 实例化浏览器驱动对象并应用配置2.7 在页面加载时执行JavaScript代码 3.完整代码(可直接…...

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17
计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-17 1. Large Language Models in Biomedical and Health Informatics: A Review with Bibliometric Analysis H Yu, L Fan, L Li, J Zhou, Z Ma, L Xian, W Hua, S He… - Journal of Healthcare …, 2024 生物…...

LLM - 理解 多模态大语言模型(MLLM) 的 幻觉(Hallucination) 与相关技术 (七)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142463789 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 多模态…...
如何在C++中实现RDP协议的屏幕更新功能?
在C++中实现RDP协议的屏幕更新功能涉及多个步骤,包括接收RDP服务器发送的屏幕更新PDU(协议数据单元)、解析这些PDU以获取图像数据,以及将这些图像数据渲染到本地显示设备上。以下是一个简化的流程,指导你如何在C++中处理这一功能: 1. 监听和接收屏幕更新PDU 首先,你的…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...