课程名称:JavaScript版数据结构与算法
课程章节:第11章 进阶算法之“搜索排序”
主讲老师:lewis
课程内容:
今天学习的内容包括:
11-9 LeetCode:21. 合并两个有序链表——使用双指针While循环判断处理即可。
11-10 LeetCode:374. 猜数字大小——通过这题熟悉和扎实二分查找。
11-11 排序与搜索-章节总结——排序和搜索总结介绍。
课程收获:
合并两个有序链表
解题思路
- 与归并排序中的合并两个有序数组很相似。
- 将数组替换成链表就能解此题。
解题步骤
- 新建一个新链表,作为返回结果。
- 用指针遍历两个有序链表,并比较两个链表的当前节点,较小者先接入新链表,并将指针后移一步。
- 链表遍历结束,返回新链表。
while (p1 && p2){
if(p1.val < p2.val){
p.next = p1;
p1 = p1.next;
}else{
p.next = p2;
p2 = p2.next;
}
p = p.next;
}
时间,空间复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
猜数字大小
解题思路
- 二分搜索的应用。
- 调用 guess 函数,来判断中间元素是否是目标值。
解题步骤
- 从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束。
- 如果目标值大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找。
while (low <= high){
const mid = Math.floor((low + high) / 2);
const res = guess(mid);
if(res === 0){
return mid;
}else if(res === 1){
low = mid + 1
}else{
high = mid -1
}
}
时间,空间复杂度分析
- 时间复杂度:O(logN)。
- 空间复杂度:O(1)。
章节总结
- 排序:把某个乱序的数组变成升序或则降序的数组。
- 搜索:找出数组中某个元素的下标。
- JS中的排序:数组的sort()方法。
- JS中的搜索:数组中indexOf()方法。
今天学习了 搜索排序的两道算法题,分别使用的是归并算法中的合并排序,以及二分搜索中的搜索方法,这两种是比较常用的,性能比较好。对自己说一句,加油😀~
坚持打卡,坚持学习!明天见💪~