leetcode435,无重叠区间。给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 [ [1,2], [2,3], [3,4], [1,3] ]移除1,3即可。
leetcode452,用最少数量的箭引爆气球。[[10,16], [2,8], [1,6], [7,12]],分别代表每个气球的左右距离,需要一个弓箭戳破。我们在x=6和x=11上就可以戳破[2,8],[1,6]和[10,16],[7,12]
对这种两两集合求交集区间的思路如下:
1、按照结束位置排序
2、创造index,start在前面,end在后面
3、以第一个start的结束位置来看,是否包含end的起始位置,进行交叉条件判断。

leetcode56,合并区间。[[1,3],[2,6],[8,10],[15,18]]合并为[[1,6],[8,10],[15,18]]
对这种两两集合求并集区间的思路如下:
1、按照开始位置排序
2、创造index,start在前面,end在后面
3、以第一个start的结束位置来看,是否包含end的起始位置,进行交叉条件判断。

leetcode253,会议室II。上下车游戏,需要把上车和下车分别排序,如果上车人数就计数++,下车时间到了就计数-- start表示占用的资源,end表示可释放的资源。
1、需要一个start函数,和他的index:si
2、需要一个end函数,和他的index:ei
3、如果start占用的资源时间到了end[ei],就count释放,不然就占用更多的资源

56

/*** 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 Comp(const void *a, const void *b)
{int ret = (*(int**)a)[0] - (*(int**)b)[0];if (ret != 0) {return ret;}return (*(int**)a)[1] - (*(int**)b)[1];
}int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){if (intervalsSize == 0) {* returnSize = 0;return NULL;}int s1, s2, cnt;s1 = 0;s2 = s1 + 1;cnt = 0;qsort(intervals, intervalsSize, sizeof(int*), Comp);int ** ret = (int**)malloc(sizeof(int*)*intervalsSize);* returnColumnSizes = (int*)malloc(sizeof(int)*intervalsSize);while(s1 < intervalsSize) {if (s2 < intervalsSize && intervals[s1][1] >= intervals[s2][0]) { //有交叉intervals[s1][1] = intervals[s1][1] > intervals[s2][1] ? intervals[s1][1] : intervals[s2][1];s2++;} else {     //无交叉,输出s1ret[cnt] = (int*)malloc(sizeof(int)*2);ret[cnt][0] = intervals[s1][0];ret[cnt][1] = intervals[s1][1];(* returnColumnSizes)[cnt] = 2;cnt++; s1 = s2;s2 = s2 + 1;}}* returnSize = cnt;return ret;
}

253

#define MAX 10000
int Comp(const void *a, const void *b)
{return *(int*)a - *(int*)b;
}
int minMeetingRooms(int** intervals, int intervalsSize, int* intervalsColSize){int stime[MAX];int etime[MAX];int i, start, end, ret, curr;for (i = 0; i < intervalsSize; i++) {stime[i] = intervals[i][0];etime[i] = intervals[i][1];}qsort(stime, intervalsSize, sizeof(int), Comp);qsort(etime, intervalsSize, sizeof(int), Comp);start = 0;end = 0;ret = 0;curr = 0;while (start<intervalsSize && end < intervalsSize) {if (etime[end] > stime[start]){curr++;start++;ret = curr > ret ? curr : ret;} else {end ++;curr--;}}return ret;
}

435

int Comp(const void*a, const void *b)
{return (*(int**)a)[1] - (*(int**)b)[1];
}
int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize) {if (intervalsSize == 0 || intervalsSize == 1) {return 0;}qsort(intervals, intervalsSize, sizeof(int*), Comp);//按照终点排序int start, end, count;start = 0;count = 0;end = start + 1;while (start < intervalsSize && end < intervalsSize) {if (intervals[start][1] <= intervals[end][0]) { //如果end的起点 比start的重点小,直接过start = end;end = end + 1;}else { // 如果起点 start 与end有重叠,有重叠,舍弃endend++;count++;}}return count;}

452

int Comp(const void *a, const void *b)
{return (*(int**)a)[1] - (*(int**)b)[1];
}
int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){if (pointsSize == 0) {return 0;}if (pointsSize == 1) {return 1;}qsort(points, pointsSize, sizeof(int*), Comp);int start, end, count;start = 0;end = start + 1;count = 1;while (end < pointsSize) {if (points[start][1] < points[end][0]) { //start 已经戳不破下一个的气球了count++;start = end;end = end + 1;} else {end++; //这个start还能用}}return count;
}

C算法-贪心+排序+双指针相关推荐

  1. Java入门算法(排序篇)丨蓄力计划

    本专栏已参加蓄力计划,感谢读者支持 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算法 ...

  2. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  3. 【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )

    文章目录 一.双指针算法分类 二.相向双指针示例 ( 有效回文串 ) 一.双指针算法分类 面试时经常遇到 限制算法复杂度为 O(n)O ( n )O(n) 的情况 , 就需要使用以下算法 : 双指针算 ...

  4. [python算法]贪心算法+实例

    目录 什么是贪心算法 应用实例 找零问题 背包问题 拼接数字问题 活动选择问题 什么是贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择. 也就是说,不从整体最优上 ...

  5. 排序算法---选择排序(java版)

    简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...

  6. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  7. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  8. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  9. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

最新文章

  1. Verilog中的逻辑运算符与按位运算符的区分
  2. 三星mzvlb1t0hblr是什么固态_三星T7 Touch 1TB移动固态硬盘评测:新奇又安全的加密方式普及?...
  3. 【机器学习】情侣、基友、渣男和狗-基于时空关联规则的影子账户挖掘
  4. php模块下载,douphp下载中心模块修改版
  5. 【转】 onNewIntent调用时机
  6. 草稿 9203 作业重点关注
  7. 【Maven】IDEA 创建Spring Boot项目出现 maven-wrapper
  8. PSpice 正版软件的下载方式
  9. 【信号与系统|吴大正】5:离散信号的傅里叶变换
  10. LU分解法求解线性方程组
  11. 服务器终端性能测试之iometer
  12. 云清联盟发布全网协同防护方案 2017将继续“纳新”共赢未来
  13. 女解码高手王小云:十年破译五部顶级密码(图)
  14. 电子邮箱邮件安全使用技巧,公司电子邮件安全使用总结
  15. 微信小程序实现生成海报并且保存本地
  16. 【线段树区间合并】BZOJ1593-[Usaco2008 Feb]Hotel 旅馆
  17. 登录接口已修复梦想贩卖机V2 2.0.4 修复版,附带安装教程。
  18. 长度短点的uuid_如何压缩UUID长度?
  19. c语言 位运算和位运算符
  20. 调查上网行为管理软件或设备

热门文章

  1. 攻防世界 reverse leaked-license-64
  2. 不安全!!!都2020年了,你的网站还没上HTPPS说得过去吗?
  3. element-ui轮播图片显示问题
  4. CSAPP bomblab
  5. STM32CubeIDE+FREERTOS踩坑记录
  6. python求个位十位百位_Js 分别取一个数的百位,十位,个位
  7. 超好玩的硬币游戏,你会玩吗?
  8. 3种方法教你应对高智商型反社会人格者
  9. 集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码
  10. ASEMI场效应管7N60的极限和静态参数详解