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

代码随想录算法训练营第三十一天|Day31 贪心算法

56. 合并区间

https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html

思路


int compare(const void *a, const void *b) {int *intervalA = *(int **)a;int *intervalB = *(int **)b;return intervalA[0] - intervalB[0]; 
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes) {if (intervalsSize == 0) {*returnSize = 0;return NULL;}qsort(intervals, intervalsSize, sizeof(int *), compare);int **mergedIntervals = (int **)malloc(intervalsSize * sizeof(int *));int count = 0; int start = intervals[0][0];int end = intervals[0][1];for (int i = 1; i < intervalsSize; i++) {if (intervals[i][0] <= end) { if (intervals[i][1] > end) {end = intervals[i][1]; }} else { mergedIntervals[count] = (int *)malloc(2 * sizeof(int));mergedIntervals[count][0] = start;mergedIntervals[count][1] = end;count++;start = intervals[i][0];end = intervals[i][1];}}mergedIntervals[count] = (int *)malloc(2 * sizeof(int));mergedIntervals[count][0] = start;mergedIntervals[count][1] = end;count++;*returnSize = count; *returnColumnSizes = (int *)malloc(count * sizeof(int));for (int i = 0; i < count; i++) {(*returnColumnSizes)[i] = 2; }return mergedIntervals; 
}

学习反思

实现了合并区间的功能。代码中的compare函数用于qsort函数的比较操作,按照区间的起始位置进行排序。merge函数将传入的区间数组进行排序,并且遍历数组进行合并操作。当当前区间的起始位置小于等于前一个区间的结束位置时,则合并区间;否则,将当前区间添加到mergedIntervals中,并更新start和end的值。最后,返回合并后的区间数组mergedIntervals。对于传入的参数,intervals是一个二维数组,表示需要合并的区间;intervalsSize表示区间的个数;intervalsColSize是一个一维数组,表示每个区间的列数;returnSize是一个指针,用于返回合并后的区间个数;returnColumnSizes是一个指针的指针,用于返回每个合并后区间的列数。

  1. 在进行区间的排序时,使用了qsort函数,并自定义了比较函数compare。这样可以根据起始位置进行排序,方便后续的合并操作。
  2. 在进行区间的合并时,使用了两个指针start和end来表示当前合并的区间的起始和结束位置。通过比较当前区间的起始位置和前一个区间的结束位置,来判断是否需要合并区间。
  3. 在合并区间时,通过动态分配内存来创建新的区间,并将其添加到mergedIntervals数组中保存。在最后返回结果之前,还需要动态分配内存来保存每个合并后区间的列数。

738.单调递增的数字

https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html

思路

int monotoneIncreasingDigits(int n) {char num[11]; sprintf(num, "%d", n);int len = strlen(num);int mark = len; for (int i = len - 1; i > 0; i--) {if (num[i] < num[i - 1]) {mark = i; num[i - 1]--; }}for (int i = mark; i < len; i++) {num[i] = '9';}return atoi(num);
}

学习反思

实现了将一个非负整数变为一个单调递增的整数的功能。代码中的monotoneIncreasingDigits函数接收一个非负整数n作为参数,并返回变换后的单调递增的整数。首先定义了一个长度为11的字符数组num,用于保存整数n的每一位数字。使用sprintf函数将整数n转换为字符串,并存储在num中。然后使用strlen函数获取字符串的长度len。接下来,使用一个变量mark来标记需要递减的位置。从后往前遍历字符串num,如果当前位置的数字小于前一个位置的数字,则将mark设置为当前位置,并将当前位置的数字减一。然后,从mark位置开始,将后面所有的数字都设置为9,以保证整数递增。最后,使用atoi函数将字符串num转换为整数,并返回结果。

总结

加油!!!


http://www.mrgr.cn/news/61942.html

相关文章:

  • 加油-加油
  • 隨筆 20241024 Kafka中的ISR列表:分区副本的族谱
  • 【速查笔记】单片机
  • 【JVM第1课】Java 跨平台原理
  • The database mes could not be exclusively locked to perform the operation.
  • 戴尔 Inspiron 14 5418 (11代)安装win10 ltsc lot 企业版
  • 【PG高可用】patroni配置文件
  • 怎样禁止运行电脑某个软件(如何禁止运行电脑软件)?3分钟学会这4招!
  • Educational Codeforces Round 171
  • OBC充电机测试性能评估
  • Java面试经典 150 题.P88. 合并两个有序数组(001)
  • 【C++】string 类深度解析:探秘字符串操作的核心
  • python公寓出租管理系统-计算机毕业设计源码00130
  • 项目开发的架构模式与异步请求(AJAX)
  • 香橙派Orangepi 5plus 配置Hailo-8/Hailo-8L
  • 2024 Rust现代实用教程:1.2编译器与包管理工具以及开发环境搭建
  • 荒野大镖客:救赎 PC版整合包
  • 【K8S系列】Kubernetes 中 NodePort 类型的 Service 无法访问的问题【已解决】
  • 基于安卓Android的助农商城系统APP(源码+文档+部署+讲解)
  • Rust 力扣 - 54. 螺旋矩阵
  • 数据结构算法学习方法经验总结
  • git快速合并代码dev->master
  • ECharts 折线图 / 柱状图 ,通用配置标注示例
  • JAVA基础-Map集合
  • 三格电子——RS485转光纤点对点式【MS-F155-M】
  • 数据结构与算法——(Hash)哈希表与哈希算法