面试常考算法之区间问题
时间:2022-07-24
本文章向大家介绍面试常考算法之区间问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
面试常考算法之区间问题
区间问题在面试及笔试中经常遇到,今天总结两个常见问题,那就是区间的并与交操作。
1.区间并集
对应题目是:
56.合并区间
https://leetcode-cn.com/problems/merge-intervals/
输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
简单理解就是区间合并!
合并简单呀,我们把区间想象成计算机组成原理上面的pipeline就行了,一段段区间,只要这个区间按照第一个元素(区间开始,记作first)排序,那么区间合并只需要关注已经合并区间的最后一个区间的last(第二个元素)与新区间的first(第一个元素)。
具体实现:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
int n = intervals.size();
if (n == 0 || n == 1) return intervals;
sort(intervals.begin(), intervals.end(), [](auto& x, auto & y) {
return x[0] < y[0];
});
ans.push_back(intervals[0]);
for (int i = 1; i < n; i++) {
// 拿到合并好的区间的最后一个区间
auto& last = ans.back();
// 新区间的第一个元素与最后一个区间的第二个元素比较
if (intervals[i][0] > last[1]) { // 产生了新区间
ans.push_back(intervals[i]);
} else if (intervals[i][1] > last[1]) {
last[1] = intervals[i][1];
}
}
return ans;
}
};
2.区间交集
对应题目是:
- 区间列表的交集
https://leetcode-cn.com/problems/interval-list-intersections/
输入:A = [[0,2],[5,10],[13,23],[24,25]], B = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
简单理解就是区间交集!
算法思路:我们需要区分有交集与没有交集情况。
现有如下两个区间求交集。
[a1,a2]
[b1,b2]
- 没有交集
那就是两种情况:1) a2 < b1 2) a1 > b2
- 有交集 a2>=b1 && a1 <= b2
可以发现,有交集就是下面区间:
[max(a1, b1), min(a2, b2)]
具体实现如下:
class Solution {
public:
vector<vector<int>> intervalIntersection(vector<vector<int>>& A, vector<vector<int>>& B) {
vector<vector<int>> ans;
int i = 0, j = 0;
while (i < A.size() && j < B.size()) {
int a1 = A[i][0];
int a2 = A[i][1];
int b1 = B[j][0];
int b2 = B[j][1];
// a2 < b1 || a1 > b2 无交集
if (a2 >= b1 && a1 <= b2) {
ans.push_back({max(a1, b1), min(a2, b2)});
}
if (b2 < a2) {
j++;
} else {
i++;
}
}
return ans;
}
};
- 事故记录-过多进程致使CPU卡死
- Flash/Flex学习笔记(54):迷你滚动条ScrollBar
- linux下正向代理/反向代理/透明代理使用说明
- 万达网科年底集体裁员?公司回应仅是业务调整
- 两个四字母域名均以五位数被交易
- Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object)
- Android Fragment完全解析
- Centos下堡垒机Jumpserver V3.0环境部署完整记录(2)-配置篇
- Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室
- 28家银行用户体验调研报告:洞见银行业的“进化论”
- 性能计数器数据收集服务
- SQL SERVER 内存分配及常见内存问题 DMV查询
- 6 利用Docker .NET应用程序模板制作您的容器应用程序(第2部分)
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- django-表单之模型表单(三)
- sqlite3数据库封装 - 动态链接库
- 【tensorflow2.0】张量的结构操作
- 指针*和引用&的区别使用
- django-表单之手动渲染(五)
- django-表单之模型表单渲染(六)
- 【tensorflow2.0】张量的数学运算
- django-表单之数据保存(七)
- 用C++跟你聊聊“中介者模式”
- 【tensorflow2.0】AutoGraph的使用规范
- django-个人网站之环境配置(一)
- 用C++跟你聊聊“职责链模式”
- django-常见问题勘误
- 【tensorflow2.0】AutoGraph和tf.Module
- mybatis之第一个mybatis程序(二)