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

代码随想录算法训练营第二十天

LeetCode题目:

  • 39. 组合总和
  • 40. 组合总和 II
  • 131. 分割回文串
  • 2176. 统计数组中相等且可以被整除的数对(每日一题)

其他:

今日总结
往期打卡


39. 组合总和

跳转: 39. 组合总和

学习: 代码随想录公开讲解

问题:

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

思路:

回溯,可以当成组合问题一次一次的选,也可以每个元素多次的选(不过效率不高).

复杂度:

  • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

代码(一层选一个):

class Solution {List<List<Integer>> ans;private final List<Integer> path = new ArrayList<>();int target;void dfs(int[] candidates, int sum,int index){if(sum>target) return;if(sum==target) ans.add(new ArrayList<>(path));for(int i=index;i<candidates.length;i++){path.add(candidates[i]);dfs(candidates,sum+candidates[i],i);path.remove(path.size()-1);}}public List<List<Integer>> combinationSum(int[] candidates, int target) {ans = new ArrayList<>();this.target = target;dfs(candidates,0,0);return ans;}
}

代码(每个选0-n次):

class Solution {List<List<Integer>> ans;int target;int[] candidates;private final List<Integer> path = new ArrayList<>();int n;void dfs(int index,int value){if(value>target) return;if(value == target){ans.add(new ArrayList<>(path));return;}if(index<0) return;int sum = 0;while(sum+value<=target){dfs(index-1,value+sum);path.add(candidates[index]);sum+=candidates[index];}int count = sum/candidates[index];path.removeAll(path.subList(path.size()-sum/candidates[index],path.size()));}public List<List<Integer>> combinationSum(int[] candidates, int target) {ans = new ArrayList<>();this.target = target;this.candidates = candidates;n = candidates.length;dfs(n-1,0);return ans;}
}

40. 组合总和 II

跳转: 40. 组合总和 II

学习: 代码随想录公开讲解

问题:

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次

**注意:**解集不能包含重复的组合。

思路:

每层同种元素只能选一个,为了更好的分辨同种元素,可以先排序

复杂度:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)

代码(回溯):

class Solution {List<List<Integer>> ans;private final List<Integer> path = new ArrayList<>();int target;void dfs(int[] candidates, int sum, int index) {if (sum == target) {ans.add(new ArrayList<>(path));return;}for (int i = index; i < candidates.length; i++) {if (sum + candidates[i] > target) {break;}if (i > index && candidates[i] == candidates[i - 1]) {continue;}path.add(candidates[i]);dfs(candidates, sum + candidates[i], i + 1);path.remove(path.size() - 1);}}public List<List<Integer>> combinationSum2(int[] candidates, int target) {ans = new ArrayList<>();Arrays.sort(candidates);// System.out.println(Arrays.toString(candidates));this.target = target;dfs(candidates, 0, 0);return ans;}
}

131. 分割回文串

跳转: 131. 分割回文串

学习: 代码随想录公开讲解

问题:

给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

思路:

在回文串位置切割,切割到最后一个位置时返回

复杂度:

  • 时间复杂度: O ( n 3 ) O(n^3) O(n3)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

代码:

class Solution {List<List<String>> ans;List<String> path = new ArrayList<>();void dfs(String s,int startIndex){if(startIndex==s.length()){ans.add(new ArrayList<>(path));}for(int i=startIndex+1;i<=s.length();i++){if(isPalindrome(s,startIndex,i-1)){path.add(s.substring(startIndex,i));}else continue;dfs(s,i);path.remove(path.size()-1);}}boolean isPalindrome(String s,int startIndex,int endIndex){while(startIndex<endIndex){if(s.charAt(startIndex++)!=s.charAt(endIndex--)) return false;}return true;}public List<List<String>> partition(String s) {ans = new ArrayList<>();dfs(s,0);return ans;}
}

2176. 统计数组中相等且可以被整除的数对(每日一题)

跳转: 2176. 统计数组中相等且可以被整除的数对

问题:

给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k ,请你返回满足 0 <= i < j < nnums[i] == nums[j](i * j) 能被 k 整除的数对 (i, j)数目

思路:

直接两层for循环遍历,遇到满足条件的位置+1

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {public int countPairs(int[] nums, int k) {int n = nums.length;int ans = 0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(nums[i]==nums[j]&&i*j%k==0) ans++;}}return ans;}
}

总结

练习了带条件的组合回溯

往期打卡

代码随想录算法训练营第十九天

代码随想录算法训练营第十八天

代码随想录算法训练营第十七天

代码随想录算法训练营周末三

代码随想录算法训练营第十六天

代码随想录算法训练营第十五天

代码随想录算法训练营第十四天

代码随想录算法训练营第十三天

代码随想录算法训练营第十二天

代码随想录算法训练营第十一天

代码随想录算法训练营周末二

代码随想录算法训练营第十天

代码随想录算法训练营第九天

代码随想录算法训练营第八天

代码随想录算法训练营第七天

代码随想录算法训练营第六天

代码随想录算法训练营第五天

代码随想录算法训练营周末一

代码随想录算法训练营第四天

代码随想录算法训练营第三天

代码随想录算法训练营第二天

代码随想录算法训练营第一天

相关文章:

代码随想录算法训练营第二十天

LeetCode题目: 39. 组合总和40. 组合总和 II131. 分割回文串2176. 统计数组中相等且可以被整除的数对(每日一题) 其他: 今日总结 往期打卡 39. 组合总和 跳转: 39. 组合总和 学习: 代码随想录公开讲解 问题: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 targ…...

DAY09:【pytorch】nn网络层

1、卷积层 1.1 Convolution 1.1.1 卷积操作 卷积运算&#xff1a;卷积核在输入信号&#xff08;图像&#xff09;上滑动&#xff0c;相应位置上进行乘加卷积核&#xff1a;又称为滤波器、过滤器&#xff0c;可认为是某种模式、某种特征 1.1.2 卷积维度 一般情况下&#xf…...

大模型面试题

分布式训练相关面试题解答 什么是分布式训练&#xff1f; 分布式训练是一种利用多个计算节点&#xff08;如多个 GPU 或多个机器&#xff09;协同工作来加速训练机器学习模型的方法。它通过将训练任务分配给多个计算资源并行执行&#xff0c;以减少训练时间和处理大规模数据。…...

跟康师傅学Java-面向对象(基础)

跟康师傅学Java-面向对象(基础) 学习面向对象内容的三条主线(非官方) ①Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类 ②面向对象的特征:封装、继承、多态、(抽象) ③其他关键字的使用:this、super、package、import、static、final、inte…...

2000-2017年各省国有经济煤气生产和供应业固定资产投资数据

2000-2017年各省国有经济煤气生产和供应业固定资产投资数据 1、时间&#xff1a;2000-2017年 2、来源&#xff1a;国家统计局、能源年鉴 3、指标&#xff1a;行政区划代码、城市、年份、国有经济煤气生产和供应业固定资产投资 4、范围&#xff1a;31省 5、指标说明&#x…...

线性代数 | 知识点整理 Ref 3

注&#xff1a;本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载&#xff0c;本篇为 Ref 3。 略作重排&#xff0c;未整理去重。 图片清晰度限于引文原状。 如有内容异常&#xff0c;请看原文。 《线性代数》总复习要点、公式、重要结论与重点释…...

从原理到实践:NFS复杂故障处理方法论

#作者&#xff1a;孙德新 文章目录 一、nfs使用概述二、疑难故障现象描述三、原理分析四、解决方案五、优化服务器资源配置&#xff1a;六、故障案例总结七、故障预防建议八、nfs优化方法 一、nfs使用概述 NFS&#xff08;Network File System&#xff09;是一种分布式文件系…...

网络层IP协议知识大梳理

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的IP协议笔记吧~ 自己写自己的八股&#xff01;让未来的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 网路基础3 网路层 TCP并没有把数据发到网路…...

【Web前端技术】第二节—HTML标签(上)

hello&#xff01;好久不见—— 做出一个属于自己的网站&#xff01; 云边有个稻草人-个人主页 Web前端技术—本篇文章所属专栏 目录 一、HTML 语法规范 1.1 基本语法概述 1.2 标签关系 二、HTML 基本结构标签 2.1 第一个 HTML 网页 2.2 基本结构标签总结 三、网页开发…...

1.Axum 与 Tokio:异步编程的完美结合

摘要 深入解析 Axum 核心架构与 Tokio 异步运行时的集成&#xff0c;掌握关键原理与实践技巧。 一、引言 在当今的软件开发领域&#xff0c;高并发和高性能是衡量一个系统优劣的重要指标。对于 Web 服务器而言&#xff0c;能够高效地处理大量并发请求是至关重要的。Rust 语言…...

08软件测试需求分析案例-删除用户

删除用户是后台管理菜单的一个功能模块&#xff0c;只有admin才有删除用户的权限。不可删除admin。 1.1 通读文档 通读需求规格说明书是提取信息&#xff0c;提出问题&#xff0c;输出具有逻辑、规则、流程的业务步骤。 信息&#xff1a;此功能应为用户提供确认删除的功能。…...

SDL基础

SDL SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个开源的跨平台多媒体开发库&#xff0c;主要用于开发需要图形、音频和输入设备支持的应用程序。它使用C语言编写&#xff0c;提供了简单易用的API&#xff0c;**能够帮助开发者快速实现跨平台的多媒体功能。**SD…...

十三种通信接口芯片——《器件手册--通信接口芯片》

目录 通信接口芯片 简述 基本功能 常见类型 应用场景 详尽阐述 1 RS485/RS422芯片 1. RS485和RS422标准 2. 芯片功能 3. 典型芯片及特点 4. 应用场景 5. 设计注意事项 6. 选型建议 2 RS232芯片 1. RS232标准 2. 芯片功能 3. 典型芯片及特点 4. 应用场景 5. 设计注意事项 6…...

反转一个字符串

用数组栈实现 void Reverse(char *C, int len) {top -1;for(int i 0; i < len; i){push(C[i]);}for(int i 0; i < len; i){C[i] Top();pop();} } 全部函数 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_SIZE 101int …...

从GPT到Gemini 大模型进化史

从GPT到Gemini&#xff1a;大模型进化史 在过去的几年里&#xff0c;人工智能领域经历了翻天覆地的变化&#xff0c;其中最引人注目的莫过于大规模语言模型的发展。从最初的GPT系列到最近的Gemini&#xff0c;这些模型不仅在技术上取得了重大突破&#xff0c;还在实际应用中展…...

【限流算法】计数器、漏桶、令牌桶算法

1 计数器 使用计数器实现限流&#xff0c;可限制在指定时间间隔内请求数小于阈值的情况&#xff0c;但存在临界问题。如图1-17所示&#xff0c;假设每分钟系统限流500个请求&#xff0c;在XX:00:59时刻系统接收到500个请求&#xff0c;在XX:01:00时刻系统又接收到500个请求&am…...

秘密任务 2.0:如何利用 WebSockets + DTOs 设计实时操作

在之前的文章中&#xff0c;我们探讨了为什么 DTO 是提升 API 效率和安全性的秘密武器。现在&#xff0c;我们进入了一个全新的场景——我们将深入探讨如何通过 WebSockets DTOs 实现实时操作&#xff01; Agent X 正在进行一项高风险的卧底任务。突然&#xff0c;总部更新了…...

‌RAII 技术详解

1. 核心概念‌ ‌定义‌&#xff1a;RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是 C 中通过对象生命周期管理资源的核心机制&#xff0c;核心思想是将资源的获取与对象构造绑定、资源释放与对象析构绑定&#xff0c;确…...

Windows快速切换屏幕/桌面

windows自带的切屏 需要winctrl 小键盘左右键 但是&#xff01; Windows使用还是键盘加鼠标舒服&#xff01; 教程 安装autohotkey 代码 ~LWin & LButton::{SendInput "^#{Left}" ; 发送 Win Ctrl Left (切换到左侧虚拟桌面) } ; 使用花括号包裹命令&a…...

SpringAI+DeepSeek大模型应用开发——3 SpringAI简介

SpringAI整合了全球&#xff08;主要是国外&#xff09;的大多数大模型&#xff0c;而且对于大模型开发的三种技术架构都有比较好的封装和支持&#xff0c;开发起来非常方便&#xff1b; 不同的模型能够接收的输入类型、输出类型不一定相同。SpringAI根据模型的输入和输出类型…...

使用 Function 来编写策略模式:优雅而高效的设计模式实践

引言&#xff1a;为什么选择策略模式&#xff1f; 策略模式&#xff08;Strategy Pattern&#xff09;是行为设计模式中的经典之一&#xff0c;它允许我们定义一系列的算法或操作&#xff0c;并使得它们可以互换使用。策略模式的关键思想是将算法的实现与使用它们的上下文分离…...

Java字符串处理

Java字符串处理全解析&#xff1a;String、StringBuilder与StringBuffer 一、String类基础 1. String的本质 不可变对象&#xff1a;Java中的String对象一旦创建就不能修改底层实现&#xff1a;基于private final char value[]字符数组字符串池&#xff1a;JVM维护的特殊存储…...

JS实现RSA加密

目录 目标 环境 实现RSA加解密 计算RSA加密允许的最大字节长度 目标 使用JS实现RSA加密解密。计算RSA加密允许的最大字节长度。 环境 node-rsa 实现RSA加解密 const NodeRSA require(node-rsa);function getKey() {const keyLength512// 创建 RSA 密钥对const key new …...

MySQL GTID集合运算函数总结

MySQL GTID 有一些运算函数可以帮助我们在运维工作中提高运维效率。 1 GTID内置函数 MySQL 包含GTID_SUBSET、GTID_SUBTRACT、WAIT_FOR_EXECUTED_GTID_SET、WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS 4个内置函数&#xff0c;用于GTID集合的基本运算。 1.1 GTID_SUBSET(set1,set2) …...

从“链主”到“全链”:供应链数字化转型的底层逻辑

1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型&#xff0c;是利用新一代数字技术&#xff08;如工业互联网、人工智能、大数据、云计算、边缘计算等&#xff09;对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…...

学习笔记十五——rust柯里化,看不懂 `fn add(x) -> impl Fn(y)` 的同学点进来!

&#x1f9e0; Rust 柯里化从零讲透&#xff1a;看不懂 fn add(x) -> impl Fn(y) 的同学点进来&#xff01; &#x1f354; 一、什么是柯里化&#xff1f;先用一个超好懂的生活比喻 假设你在点一个汉堡&#xff1a; 你说&#xff1a;我要点一个鸡腿汉堡&#xff01; 店员…...

定制化突围:遨游防爆手机的差异化竞争策略

在石油、化工、矿山等危险作业场景中&#xff0c;随着工业智能化与安全生产需求的升级&#xff0c;行业竞争逐渐从单一产品性能的比拼转向场景化解决方案的深度较量。遨游通讯以九重防爆标准为技术底座&#xff0c;融合多模稳控系统与全景前瞻架构&#xff0c;开辟出"千行…...

【Java学习笔记】进制与进制转换

进制与进制转换 一、进制介绍 二进制&#xff1a;0、1&#xff0c;满 2 进 1&#xff0c;以 0b 或 0B 开头。 十进制&#xff1a;0-9&#xff0c;满 10 进 1。 八进制&#xff1a;0-7&#xff0c;满 8 进 1&#xff0c;以数字 0 开头表示。 十六进制&#xff1a;0-9 及 A(10…...

士兵乱斗(贪心)

问题 B: 士兵乱斗 - USCOJ...

【C++面向对象】封装(下):探索C++运算符重载设计精髓

&#x1f525;个人主页 &#x1f525; &#x1f608;所属专栏&#x1f608; 每文一诗 &#x1f4aa;&#x1f3fc; 年年岁岁花相似&#xff0c;岁岁年年人不同 —— 唐/刘希夷《代悲白头翁》 译文&#xff1a;年年岁岁繁花依旧&#xff0c;岁岁年年看花之人却不相同 目录 C运…...