算法每日一练 (25)

news2025/5/17 13:12:50

💢欢迎来到张翊尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • 算法每日一练 (25)
    • 四数之和
      • 题目描述
      • 解题思路
      • 解题代码
        • `c/c++`
        • `golang`
        • `lua`

官方站点: 力扣 Leetcode

算法每日一练 (25)

四数之和

题目地址:四数之和

题目描述

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abcd 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

提示:

  • 1 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109

解题思路

  • 本题解法采用了回溯的思路。

本题可以采用双指针进行算法优化,感兴趣的小伙伴可以自行查阅。

  • 由题意可知,四元组需要满足以下条件:
    • 四元组中的数字可以按任意顺序排列。
    • 解集不能包含重复的四元组。
  • 整体代码分为了两部分:
    • fourSum:这是主函数,负责初始化和调用回溯函数。
    • traceback:这是一个递归函数,用于通过回溯法生成所有可能的四元组。
  • 首先对输入数组 nums 进行排序。排序的目的是为了方便后续去重和剪枝操作。
  • 紧接着,创建辅助集合 t 和结果集合 res:
    • t 是一个临时向量,用于存储当前递归路径中的数字。
    • res 是最终结果,用于存储所有满足条件的四元组。
  • 然后调用回溯函数 traceback,该函数的逻辑主要分为以下几部分:
    • 递归终止条件
      • 如果 t 的大小超过 4,则直接返回,因为四元组最多只能有 4 个数字。
      • 如果 t 的大小恰好为 4,检查当前和 cursum 是否等于目标值 target。如果相等,则将 t 添加到结果 res 中。
    • 循环遍历
      • 从当前索引 index 开始,遍历数组中的每个数字。
      • 去重:如果当前数字与前一个数字相同(nums[i] == nums[i - 1]),则跳过当前数字,避免重复解。
      • 剪枝:如果当前和加上当前数字已经大于目标值,并且当前数字是非负数,则直接跳出循环,因为后续数字只会更大。
      • 递归调用:将当前数字加入临时向量 t,递归调用 traceback,并将当前索引加 1,当前和加上当前数字。
      • 回溯:递归返回后,将当前数字从 t 中移除,继续尝试下一个数字。
  • 最后着重强调:本题目采用回溯法时间复杂度较高,尤其是在数组较大时,可能会导致性能瓶颈

解题代码

c/c++
#include <vector>
#include <algorithm>

class Solution
{
public:
    std::vector<std::vector<int>> fourSum(std::vector<int> &nums, int target)
    {
        std::vector<int> t;
        std::vector<std::vector<int>> res;
        std::sort(nums.begin(), nums.end());
        traceback(nums, t, target, 0, 0, res);
        return res;
    }

private:
    void traceback(std::vector<int> &nums, std::vector<int> &t,
                   int target, int index, long long int cursum,
                   std::vector<std::vector<int>> &res)
    {
        int sz = t.size();
        if (sz > 4)
            return;

        if (sz == 4)
        {
            if (cursum == target)
                res.push_back(t);
            return;
        }

        for (int i = index; i < nums.size(); i++)
        {
            if (i > index && nums[i] == nums[i - 1])
                continue;

            if (cursum + nums[i] > target && nums[i] >= 0)
                break;

            t.push_back(nums[i]);
            traceback(nums, t, target, i + 1, cursum + nums[i], res);
            t.pop_back();
        }
    }
};
golang
import "sort"

func fourSum(nums []int, target int) [][]int {
	res := make([][]int, 0)
	sort.Ints(nums)
	traceback(nums, []int{}, target, 0, 0, &res)
	return res
}

func traceback(nums []int, t []int, target, index, cursum int, res *[][]int) {
	sz := len(t)
	if sz > 4 {
		return
	}

	if sz == 4 {
		if cursum == target {
			r := make([]int, sz)
			copy(r, t)
			*res = append(*res, r)
		}
		return
	}

	for i := index; i < len(nums); i++ {
		if i > index && nums[i] == nums[i-1] {
			continue
		}

		if cursum+nums[i] > target && nums[i] >= 0 {
			break
		}

		t = append(t, nums[i])
		traceback(nums, t, target, i+1, cursum+nums[i], res)
		t = t[:len(t)-1]
	}
}
lua
local function copyTable(dst, src)
    for i = 1, #src do
        dst[i] = src[i]
    end
end

local function traceback(nums, t, target, index, cursum, res)
    local sz = #t
    if sz > 4 then
        return
    end

    if sz == 4 then
        if cursum == target then
            local dst = {}
            copyTable(dst, t)
            table.insert(res, dst)
        end
        return
    end

    for i = index, #nums do
        if i > index and nums[i] == nums[i - 1] then
            goto continue
        end

        table.insert(t, nums[i])
        traceback(nums, t, target, i + 1, cursum + nums[i], res)
        table.remove(t, #t)
        ::continue::
    end
end


local function fourSum(nums, target)
    local res = {}
    local t = {}
    table.sort(nums)
    traceback(nums, t, target, 1, 0, res)
    return res
end

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

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

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

相关文章

【大模型基础_毛玉仁】6.4 生成增强

目录 6.4 生成增强6.4.1 何时增强1&#xff09;外部观测法2&#xff09;内部观测法 6.4.2 何处增强6.4.3 多次增强6.4.4 降本增效1&#xff09;去除冗余文本2&#xff09;复用计算结果 6.4 生成增强 检索器得到相关信息后&#xff0c;将其传递给大语言模型以期增强模型的生成能…

【GCC警告报错4】warning: format not a string literal and no format arguments

文章主本文根据笔者个人工作/学习经验整理而成&#xff0c;如有错误请留言。 文章为付费内容&#xff0c;已加入原创保护&#xff0c;禁止私自转载。 文章发布于&#xff1a;《C语言编译报错&警告合集》 如图所示&#xff1a; 原因&#xff1a; snprintf的函数原型&#x…

【落羽的落羽 C++】模板简介

文章目录 一、模板的引入二、函数模板1. 函数模板的使用2. 函数模板的原理3. 函数模板的实例化4. 函数模板的匹配 三、类模板 一、模板的引入 假如我们想写一个Swap函数&#xff0c;针对每一种类型&#xff0c;都要函数重载写一次&#xff0c;但它们的实现原理是几乎一样的。在…

USB(通用串行总线)数据传输机制和包结构简介

目录 1. USB的物理连接电缆结构时钟恢复技术 2. USB的数据传输方式包&#xff08;Packet&#xff09; 3. 包的传输规则帧和微帧 4. 包的结构1. 同步字段&#xff08;Sync&#xff09;2. 包标识符字段&#xff08;PID&#xff09;3. 数据字段4. 循环冗余校验字段&#xff08;CRC…

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解前言YOLOV3的模型结构YOLOV3模型的基本执行流程YOLOV3模型的网络参数 YOLOV3的核心思想前向传播阶段反向传播阶段 总结 前言 YOLOV3是由华盛顿…

IdeaVim-AceJump

‌AceJump 是一款专为IntelliJ IDEA平台打造的开源插件&#xff0c;旨在通过简单的快捷键操作帮助用户快速跳转到编辑器中的任何符号位置&#xff0c;如变量名、方法调用或特定的字符串‌。无论是大型项目还是日常编程&#xff0c;AceJump 都能显著提升你的代码导航速度和效率。…

DayDreamer: World Models forPhysical Robot Learning

DayDreamer&#xff1a;用于物理机器人学习的世界模型 Philipp Wu* Alejandro Escontrela* Danijar Hafner* Ken Goldberg Pieter Abbeel 加州大学伯克利分校 *贡献相同 摘要&#xff1a;为了在复杂环境中完成任务&#xff0c;机器人需要从经验中学习。深度强化学习是机器人学…

Flutter vs React Native:跨平台移动开发框架对比

文章目录 前言1. 框架概述什么是 Flutter&#xff1f;什么是 React Native&#xff1f; 2. 性能对比Flutter 的性能表现React Native 的性能表现总结&#xff1a; 3. 开发体验对比3.1 开发效率3.2 UI 组件库 4. 生态系统对比5. 适用场景分析6. 结论&#xff1a;如何选择&#x…

用matlab搭建一个简单的图像分类网络

文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData&#xff0c;每个数字文件夹里包含1000张对应这个数字的图片&#xff0c;图片的尺寸都是 28281 像素的&#xff0c;如下图所示…

【AI4CODE】5 Trae 锤一个基于百度Amis的Crud应用

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 【AI4CODE】3 Trae 锤一个贪吃蛇的小游戏 【AI4CODE】4 Trae 锤一个数据搬运工的小应用 1 百度 Amis 简介 百度 Amis 是一个低代码前端框架&#xff0c;由百度开源。它通过 J…

npm webpack打包缓存 导致css引用地址未更新

问题如下&#xff1a; 测试环境配置&#xff1a; publicPath: /chat/,生产环境配置&#xff1a; publicPath: /,css中引用背景图片 background-image: url(/assets/images/calendar/arrow-left.png);先打包测试环境&#xff0c;观察打包后的css文件引用的背景图片地址 可以全…

ollama导入huggingface下载的大模型并量化

1. 导入GGUF 类型的模型 1.1 先在huggingface 下载需要ollama部署的大模型 1.2 编写modelfile 在ollama 里面输入 ollama show --modelfile <你有的模型名称> eg: ollama show --modelfile qwen2.5:latest修改其中的from 路径为自己的模型下载路径 FROM /Users/lzx/A…

Java 集合 Map Stream流

目录 集合遍历for each map案例 ​编辑 这种数组的遍历是【index】​编辑map排序【对象里重写compareTo​编辑map排序【匿名内部类lambda​编辑 stream流​编辑 ​编辑获取&#xff1a; map的键是set集合&#xff0c;获取方法map.keySet() map的值是collection 集合&…

【网络安全实验】PKI(证书服务)配置实验

目录 一、PKI相关概念 1.1 定义与核心功能 1.2 PKI 系统的组成 1.证书颁发机构&#xff08;CA, Certificate Authority&#xff09; 2.注册机构&#xff08;RA, Registration Authority&#xff09; 3.数字证书 1.3 PKI 的功能 1.4 PKI认证体系&#xff1a; 工作流程 …

【数据集】多视图文本数据集

多视图文本数据集指的是包含多个不同类型或来源的信息的文本数据集。不同视图可以来源于不同的数据模式&#xff08;如原始文本、元数据、网络结构等&#xff09;&#xff0c;或者不同的文本表示方法&#xff08;如 TF-IDF、词嵌入、主题分布等&#xff09;。这些数据集常用于多…

学透Spring Boot — 007. 七种配置方式及优先级

Spring Boot 提供很多种方式来加载配置&#xff0c;本文我们会用Tomcat的端口号作为例子&#xff0c;演示Spring Boot 常见的配置方式。 几种配置方式 使用默认配置 新建一个项目什么都不配置&#xff0c;Spring Boot会自动配置Tomcat端口号。 启动日志 TomcatWebServer :…

【youcans论文精读】弱监督深度检测网络(Weakly Supervised Deep Detection Networks)

欢迎关注『youcans论文精读』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans论文精读】弱监督深度检测网络 WSDDN 0. 弱监督检测的开山之作0.1 论文简介0.2 WSDNN 的步骤0.3 摘要 1. 引言2. 相关工作3. 方法3.1 预训练网络3.2 弱监督深度检测网络3.3 WSDDN训练3.4 空间…

【服务日志链路追踪】

MDCInheritableThreadLocal和spring cloud sleuth 在微服务架构中&#xff0c;日志链路追踪&#xff08;Logback Distributed Tracing&#xff09; 是一个关键需求&#xff0c;主要用于跟踪请求在不同服务间的调用链路&#xff0c;便于排查问题。常见的实现方案有两种&#x…

【行测】判断推理:图形推理

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;读不在三更五鼓&#xff0c;功只怕一曝十寒。 > 目标&#xff1a;掌握 图形推理 基本题型&#xff0c;并能运用到例题中。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! …

3D模型给可视化大屏带来了哪些创新,都涉及到哪些技术栈。

一、3D 模型给可视化大屏带来的创新 更直观的视觉体验 传统的可视化大屏主要以二维图表和图形的形式展示数据&#xff0c;虽然能够传达一定的信息&#xff0c;但对于复杂的场景和数据关系&#xff0c;往往难以直观地呈现。而 3D 模型可以将数据以三维立体的形式展示出来&#…