【代码随想录】【算法训练营】【第28天】 [93]复原IP地址 [78]子集 [90]子集II

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 28,工作的周二~

题目详情

[93] 复原 IP 地址

题目描述

93 复原 IP 地址
93 复原 IP 地址

解题思路

前提:分割问题
思路:回溯算法,确定每次递归回溯的分割位置。
重点:主要考虑清除分割位置的选取,即树状结构的划分。

代码实现

C语言
回溯

保存.的位置 + 字符串尾\0 + returnSize初始化为0

/*** Note: The returned array must be malloced, assume caller calls free().*/bool isValidIp(char *s, int startIdx, int endIdx)
{if ((s == NULL) || (strlen(s) == 0) || (startIdx > endIdx)){return false;}// 起始为0情况if ((s[startIdx] == '0') && (startIdx != endIdx)){return false;}// 无效字符情况int num = 0;for (int idx = startIdx; idx <= endIdx; idx++){if ((s[idx] < '0') || (s[idx] > '9')){return false;}num = num * 10 + (s[idx] - '0');}// 超过255情况if (num > 255){return false;}return true;
}void backtracking(char *s, int strLen, int startIdx, int protNum, int *portLoc, char ***ans, int *returnSize)
{// 退出条件if (protNum == 3) {// 判断最后一段是否符合IP有效段if (((strLen - startIdx) < 4) && (isValidIp(s, startIdx, strLen - 1))) {// 保存输出结果*ans = (char **)realloc(*ans, sizeof(char *) * (*returnSize + 1));(*ans)[*returnSize] = (char *)malloc(sizeof(char) * 17);int count = 0;int tmp = 0;for (int i = 0; i < strLen; i++){if ((count < 3) && (portLoc[count] == i)){(*ans)[*returnSize][tmp++] = '.';count++;}(*ans)[*returnSize][tmp++] = s[i];}(*ans)[*returnSize][tmp] = '\0';(*returnSize)++;}return ;}//递归for (int idx = startIdx; (idx < strLen) && (idx < startIdx + 4); idx++){// 判断是否为IP有效段if (isValidIp(s, startIdx, idx)) {// 有效,保存该.位置portLoc[protNum] = idx + 1;}else {continue;}backtracking(s, strLen, idx + 1, protNum + 1, portLoc, ans, returnSize);// 回溯}
}char** restoreIpAddresses(char* s, int* returnSize) {*returnSize = 0;char **ans = NULL;if ((s == NULL) || (strlen(s) == 0)){return NULL;}// 输出变量初始化int strLen = strlen(s);int portLoc[3] = {0};backtracking(s, strLen, 0, 0, portLoc, &ans, returnSize);return ans;
}

[78] 子集

题目描述

78 子集
78 子集

解题思路

前提:组合子集问题, 无重复元素
思路:回溯,输出树上所有节点的路径
重点:先输出路径,再判断退出条件,以免遗漏子集。

代码实现

C语言
回溯

树的所有结点路径 + 全局变量初始化

/*** 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 **ans;
int ansSize = 0;
int *colSizes;
int *tmpNums;
int tmpNumsSize = 0;void collect()
{ans[ansSize] = (int *)malloc(sizeof(int) * tmpNumsSize);for (int i = 0; i < tmpNumsSize; i++) {ans[ansSize][i] = tmpNums[i];}colSizes[ansSize] = tmpNumsSize;ansSize++;return ;
}void backtracking(int *nums, int numsSize, int startIdx)
{// 收集该结点路径collect();// 终止条件if (startIdx >= numsSize) {return ;}// 递归for (int j = startIdx; j < numsSize; j++) {// 保存该结点tmpNums[tmpNumsSize++] = nums[j];backtracking(nums, numsSize, j + 1);// 回溯tmpNumsSize--;}return ;
}int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {// 全局变量初始化ans = (int **)malloc(sizeof(int *) * 10000);colSizes = (int *)malloc(sizeof(int) * 10000);tmpNums = (int *)malloc(sizeof(int) * numsSize);ansSize = 0;tmpNumsSize = 0;backtracking(nums, numsSize, 0);*returnSize = ansSize;*returnColumnSizes = colSizes;return ans;
}

[90] 子集II

题目描述

90 子集II
90 子集II

解题思路

前提:组合子集问题,有重复元素
思路:回溯,排序后同一树层去重, 输出树上所有节点的路径。
重点:同一树层去重; 先输出路径,再判断退出条件,以免遗漏子集。

代码实现

C语言
回溯

回溯 + 同一树层元素去重 + 输出全结点路径

/*** 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 **ans;
int ansSize;
int *length;
int *path;
int pathSize;
bool *used;int cmp(void *p1, void *p2)
{return *(int *)p1 > *(int *)p2;
}void collect()
{ans[ansSize] = (int *)malloc(sizeof(int) * pathSize);// 输出该子集for (int j = 0; j < pathSize; j++) {ans[ansSize][j] = path[j];}length[ansSize] = pathSize;ansSize++;return ;
}void backtracking(int *nums, int numsSize, int startIndex)
{// 输出该子集collect();// 退出条件if (startIndex >= numsSize) {return;}// 递归for (int i = startIndex; i < numsSize; i++) {// 去重if ((i > 0) && (nums[i] == nums[i - 1]) && (used[i - 1] == false)) {continue;}// 保存该元素path[pathSize++] = nums[i];used[i] = true;backtracking(nums, numsSize, i + 1);// 回溯pathSize--;used[i] = false;}return ;
}int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {// 全局变量初始化ans = (int **)malloc(sizeof(int *) * 10000);ansSize = 0;length = (int *)malloc(sizeof(int) * 10000);path = (int *)malloc(sizeof(int) * numsSize);pathSize = 0;used = (bool *)malloc(sizeof(bool) * numsSize);for (int k = 0; k < numsSize; k++) {used[k] = false;}// 排序qsort(nums, numsSize, sizeof(int), cmp);// 回溯backtracking(nums, numsSize, 0);// 赋值输出结果*returnSize = ansSize;*returnColumnSizes = length;return ans;
}

今日收获

  1. 组合分割问题:分割位置的递归回溯,叶子结点的路径输出
  2. 组合子集问题:元素是否重复,同一树层去重,所有结点的路径输出。

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

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

相关文章

小短片创作-理论知识(五)

1、网格体绘制 1.UE5打开Megascan插件的材质混合器&#xff0c;创建混合材质&#xff0c;最多选择3个材质进行混合&#xff0c; 2.通过模式->网格体绘制&#xff0c;进入网格体绘制模式&#xff0c;通过select选择一个平面进行绘制&#xff0c;然后通过paint进行绘制&am…

【Mac】Keyboard Maestro for Mac(键盘大师)软件介绍及安装教程

软件介绍 Keyboard Maestro for mac&#xff08;键盘大师&#xff09;是目前Mac OS平台上功能最为齐全的Mac键盘增强工具&#xff0c;它能将你的Keyboard作用发挥到极致&#xff0c;可以根据命令或计划自动执行简单或复杂的应用程序或网站&#xff0c;文本或图像。使用Keyboar…

【TPAMI-2024】EfficientTrain++帮你降低网络训练的成本

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言论文更容易学习的模式:频域易于学习的模式:空间域统一的训练课程 EFFICIENTTRAIN计…

RIP v2路由安全认证综合实验

RIP v2路由安全认证综合实验 实验拓扑&#xff1a; 实验要求&#xff1a;通过认证防范攻击者获得通信设备的相关信息。 实验步骤&#xff1a; 1.完成基本配置 sys Enter system view, return user view with CtrlZ. [Huawei]sys AR1 [AR1]undo in e Info: Information center…

【电子书赠送福利】蘇小沐电子数据取证实务教程!风吹哪页读哪页,哪页不会撕哪页!

【电子书赠送福利】蘇小沐电子数据取证实务教程&#xff01;风吹哪页读哪页&#xff0c;哪页不会撕哪页&#xff01; 合并文章的时候才发现自己写了那么多&#xff0c;受限于时间&#xff0c;第一次合集版本只收录了已发博客的三分之二左右&#xff0c;暂时先这样&#xff01;…

外汇天眼:Bitpanda 扩大与德意志银行的合作

金融科技独角兽Bitpanda正在扩大与德意志银行的合作&#xff0c;为德国用户提供实时支付解决方案&#xff0c;以处理进出交易。 这种基于API的账户解决方案将使Bitpanda能够访问德国的IBAN账户&#xff0c;优化和增强用户体验&#xff0c;同时确保信任、速度和效率。 这只是Bi…

七大战略性新兴产业崭露头角:新能源电燃灶或将成为未来厨房新宠

近日&#xff0c;在国家发布的七大战略性新兴产业名单中&#xff0c;新能源产业赫然在列&#xff0c;作为其中的重要组成部分&#xff0c;华火新能源电燃灶凭借其独特的优势&#xff0c;正逐渐走进人们的视野&#xff0c;有望成为未来厨房的新宠。 华火新能源电燃灶作为清洁能源…

NeuralForecast 多变量的处理 包括训练和推理

NeuralForecast 多变量的处理 包括训练和推理 flyfish 两个excel表格合并后的结果 unique_id ds y ex_1 ex_2 ex_3 ex_4 0 HUFL 2016-07-01 00:00:00 -0.041413 -0.500000 0.166667 -0.500000 -0.001370 1 …

Houdini pbd_constraints.h的文件位置

Houdini安装目录下的houdini\vex\include文件夹 C:\Program Files\Side Effects Software\Houdini 19.5.716\houdini\vex\include

17.调用游戏本身的hp减伤害函数实现秒杀游戏角色

上一个内容&#xff1a;16.在目标进程构建CALL执行代码 16.在目标进程构建CALL执行代码在它的代码上进行的更改&#xff0c;它的callData变量中的代码不完善一个完整的函数是由return的处理器执行到return会返回如果执行不到会继续往下走&#xff0c;直到执行不下去或者执行到…

Facebook开户 | Facebook海外三不限的价值

在当今数字化时代&#xff0c;海外数字营销已经成为企业推广和品牌建设的重要手段。在这个过程中&#xff0c;社交媒体平台扮演着至关重要的角色&#xff0c;而Facebook作为全球最大的社交媒体平台之一&#xff0c;其海外三不限账户近年来引起了越来越多数字营销从业者的关注。…

技术积累1:Java容错机制

如何优雅地重试 原创 赵九文 字节跳动技术团队 2021-01-05 10:01 背景 在微服务架构中&#xff0c;一个大系统被拆分成多个小服务&#xff0c;小服务之间大量 RPC 调用&#xff0c;经常可能因为网络抖动等原因导致 RPC 调用失败&#xff0c;这时候使用重试机制可以提高请求的…

【话题】开源大模型与闭源带模型你更看好哪一方

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言评价AI模型“好不好”及“有没有发展”开源与闭源&#xff1a;两种发展路径的比较开源的优势与劣势闭源的优势与劣势 开源与闭源&#xff1a;你更看好哪一种&#x…

gitbook安装 报错处理 windows系统

首先需要有nodejs。若没有&#xff0c;则去nodejs官网下载nodejs安装。 然后安装gitbook。命令如下&#xff1a;这是在linux系统的命令。 $ npm config set registry http://registry.npm.taobao.org #设置一下淘宝镜像&#xff08;非必选&#xff09; $ npm install gitbo…

域环境信息收集

背景 一个具有一定规模的企业&#xff0c;每天都可能面临员工入职和离职&#xff0c;因此网络管理部门经常需要对域成员主机进行格式化消除磁的文件&#xff0c;然后重装系统及软件&#xff0c;以提供给新员工使用;因此&#xff0c;为了便于后期交接&#xff0c;大多网络管理员…

21、matlab生成脉冲序列:pulstran()函数

1、pulstran()函数 1&#xff09;语法 语法1&#xff1a;y pulstran(t,d,func,fs) 基于连续函数的采样产生脉冲序列。 语法2&#xff1a;y pulstran(t,d,p) 生成一个脉冲序列&#xff0c;该脉冲序列是向量p中原型脉冲的多个延迟插值的总和。 语法3&#xff1a;y pulstran…

USB HOST DWC3 初始化

https://www.cnblogs.com/newjiang/p/15675746.html 如果dr_mode为device&#xff0c;则初始化gadget。 如果dr_mode为host&#xff0c;需要初始化xHCI驱动。在dwc3_host_init函数的最后调用platform_device_add(xhci)添加platform device&#xff08;xhci-hcd&#xff09;&a…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等

参考: https://310.ai/copilot 可以通过自然语言对话形式实现小分子、蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质…

算法每日一题(python,2024.05.26) day.8

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 双指针&#xff0b;交换&#xff0c;使用left和right两个指针&#xff0c;right指针向右移动&#xff0c;left从数组首位开始&#xff0c;当right找到非…

Vue.js 动画与过渡效果实战

title: Vue.js 动画与过渡效果实战 date: 2024/6/4 updated: 2024/6/4 description: 这篇文章介绍了如何在网页设计中使用过渡动画和组件效果&#xff0c;以及如何利用模式和列表展示信息。还提到了使用钩子实现组件间通信的方法。 categories: 前端开发 tags: 过渡动画组件…