两个数组如下:
var date1 = ['2021/05/01','2021/05/02','2021/05/03','2021/05/04','2021/05/05',,'2021/05/06','2021/05/07'];
var date2 = ['2021/05/01','2021/05/03','2021/05/06','2021/05/07'];
怎样以较低的时间复杂度,在date2中对应位置(顺序排)插入,比date1缺少的日期?
两个数组如下:
var date1 = ['2021/05/01','2021/05/02','2021/05/03','2021/05/04','2021/05/05',,'2021/05/06','2021/05/07'];
var date2 = ['2021/05/01','2021/05/03','2021/05/06','2021/05/07'];
怎样以较低的时间复杂度,在date2中对应位置(顺序排)插入,比date1缺少的日期?
先对数据排序,然后确定谁的数据范围更大,最后比较相同位置的数据是否相同,不相同则把大范围集合中的数据插入到小范围集合对应的位置。
//假定排序和集合范围已确定
for(let i =0; i < date1.length; i ++) {
if (date[i] && date1[i]!== date2[i]) {
date2.splice(i, 0, date1[i]);
}
}
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
假设输入并不是有序的时间复杂度O(NLog(N) + M Log(M)) 其中N为数组1的长度,M为数组2的长度,如果已经是有序的,可以删除排序的部分,时间复杂度可达到O(N),N为两个数组长度的和
简单版本: 因为javascrit里面数组的sort函数默认就是按字典序排序的所以可以写成这样,时间复杂度O(N *Log(N))
相比前一版本对多出两轮迭代,而且使用了Set去重虽然理论上初始化Set的时间复杂度是O(N)但是还是要比上面那种一轮迭代直接去重的常数要大的