2021.5.6-2021.5.11
被五一假期侵占了刷题日子的 只精选出6道题的一周QAQ
下周的归并排序要努力刷题鸭!
涉及题目为 快速排序&字节校园每日一题 面试高频题
第四周刷题结束后 进行一个简单总结
本周额外找来了一些字节校园的每日一题(刷着有收获的)
本总结包含——
【1】每道题的代码设计思路
照着代码设计思路来套代码 香~
【2】Java实现的代码
由于本人太笨 所以代码的注释做得贼足(注释如有问题 感恩大佬的指正~)
希望能让像我一样的小白们也能看懂代码以及思路hhh
【3】每道题的力扣链接
只看不敲怎么起到练习作用!
赶紧打开链接把代码敲一遍!!
一次搞不懂就清空了敲两次!
冲冲冲!
题目参考开课吧某算法课程胡船长给出的内容~
题号 | 快速排序基础 |
---|---|
LC148 | 排序链表 |
LC912 | 排序数组 |
剑指Offer21 | 【好题记号】调整数组顺序 使奇数位于偶数前面 |
题号 | 快速排序扩展 |
---|---|
LC75 | 颜色分类 |
题号 | 高频好题 |
---|---|
LC470 | 【好题记号】用Rand7() 实现 Rand10() |
剑指Offer22 | 【字节校园每日一题】链表中倒数第k个节点 |
文章目录
LC148 排序链表
0.刷题前需知
这题…虽然算在我们的快速排序专题中
但是这个题不要用快排!因为时间复杂度比题目要求要高!
但是!!
特么面试要考。
啥都得练呗
1.读题
给你链表的头结点 head 请将其按照升序排列 并返回 排序后的链表
2.代码逻辑
借鉴下大佬的解题思路
【1】选取头节点作为基准值pivot(之前不说是pivot随便儿取不影响时间复杂度嘛~)
【2】遍历链表 比基准值(也就是头节点)小的节点头插在它前面
【2‘】比基准值大的节点尾插在它后面
【3】假设lhead维护的是小于基准值的头插指针
【3’】utail维护的是大于等于基准值的尾插指针
【4】一次对[head , end)快排结束后得到——
【4’】[lhead, head) 这是小于基准值的那一部分
【4‘’】[lhead.next,end) 这是大于基准值的哪部分
【5】分别递归这两部分 最后做一个拼接~
3.Java代码
class Solution {
public ListNode sortList(ListNode head) {
return quicksort(head, null);
}
public static ListNode quicksort(ListNode head, ListNode end){
if(head == end || head.next == end) return head;//【1】设置退出条件
ListNode lhead = head, utail = head, p = head.next;//[3]维护小于基准值的头插指针lhead 大于基准值的尾插指针utail
while (p != end){
ListNode next = p.next;
if (p.val < head.val){
//进行头插
p.next = lhead;
lhead = p;
}
else {
//进行尾插
utail.next = p;
utail = p;
}
p = next;
}
utail.next = end;
ListNode node = quicksort(lhead, head);
head.next = quicksort(head.next, end);
return node;
}
}
终于是成功了一次!
总之 这个快排单链表的方法还是能不用就不用!太容易失败了!
LC912 排序数组
0.好题记号!
这题用来复习几种排序的写法再好不过了!
本题使用快速排序
使用了一个大佬分享的超级好理解的“挖坑填坑法”来解决数组分段的问题
虽说在python中只要一个
left = [i for i in arr[1:] if i <= pivot]
right = [i for i in arr[1:] if i > pivot]
就可以分区
但是…
这不是没有这个方法可以用嘛~
1.读题
2.代码逻辑
【1】想好要写两个函数 一个进行递归 一个进行数组的分组并最终返回基准值对应的索引
【2】挖坑法解决分组所用的函数 分组所用的函数写出来了 这道题其实就出来了!
【2】首先肯定是要选定好基准值 这个“填坑法”中 基准值是low指针指向的那个值
因为要在low指针指向的位置挖至关重要的“第一个坑”
【2‘】第一轮遍历 从high指针开始 一旦遍历到比基准值小的 就拿这个小值进行填坑
【2’】第二轮遍历 从low指针开始 一旦遍历到比基准值大的 就拿这个大值进行填坑
【2‘’】最后将我们的基准值放回去 返回用来分隔数组的“定海神针”
【3】接下来的递归就很轻松咯~
【4】最后调用quicksort函数 得到我们排序好的数组
3.Java代码
class Solution {
public int[] sortArray(int[] arr) {
quickSort(arr, 0, arr.length <