2021.5.12-2021.5.18
涉及题目为 动态规划 贪心算法&选择排序&字节校园每日一题 面试高频题
第五周刷题结束后 进行一个简单总结
本总结包含——
【1】每道题的刷题笔记链接
每日一篇的题解
记录了这道题的
- 解题思路
- 代码逻辑 —— 跟着代码逻辑走一遍当前解决方法的思路0!
- 详细代码
【2】Java实现的代码
由于本人太笨 所以代码的注释做得贼足(注释如有问题 感恩大佬的指正~)
希望能让像我一样的小白们也能看懂代码以及思路hhh
【3】每道题的力扣链接
只看不敲怎么起到练习作用!
赶紧打开链接把代码敲一遍!!
一次搞不懂就清空了敲两次!
冲冲冲!
题号 | 选择排序 |
---|---|
LC148 | 排序链表 |
剑指Offer51 | 数组中的逆序对 |
LC33 | 搜索旋转排序数组 |
题号 | 贪心算法&动态规划 |
---|---|
LC53 | 最大子序和 |
题号 | 面试高频好题 |
---|---|
LC206 | 反转链表 |
LC92 | 反转链表II |
LC406 | 根据身高重建队列 |
文章目录
LC148 排序链表
注释齐全的代码
class Solution {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null){
return head;//退出条件
}
ListNode midNode = findMidNode(head);//这个是链表的中间结点
//之后我们要写出 找到中间结点的函数~
ListNode rightHead = midNode.next;//定义好右边链表的头结点
midNode.next = null;//在中间结点处断开链表~
ListNode left = sortList(head);//开始递归~对左边的链表进行排序
ListNode right = sortList(rightHead);//对右边的链表进行排序
return merge(left, right);//将左右链表进行合并
}
//01 写出寻找中间结点的函数
//其实这个本身也可以作为一道题嘛~
public ListNode findMidNode(ListNode head){
if (head == null || head.next == null){
return head;//退出条件
}
//熟悉的双指针法~快指针一下跑俩结点 慢指针跑一个
//等快指针指向空或快指针的下一位指向空 就说明慢指针是指向中间辽~
ListNode slow = head;
ListNode fast = head.next.next;
while(fast != null && fast.next != null){
//注意这里的条件
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
//02 写出链表合并的函数
public ListNode merge(ListNode left, ListNode right){
ListNode dummyNode = new ListNode(0);
ListNode current = dummyNode;
while(left != null && right != null){
if (left.val < right.val) {
current.next = left;
left = left.next;
}
else{
current.next = right;
right = right.next;
}
current = current.next;
}
current.next = left != null ? left : right;
return dummyNode.next;
}
}
剑指Offer51 数组中的逆序对
可以说是归并排序的一道模板题了?
Java代码
v1.0 暴力循环解法
public class Solution {
public int reversePairs(int[] nums){
int count = 0;
int len = nums.length;
for (int i = 0;i < len - 1; i++){
for (int j = i +