5 快速排序 字节校园每日一题——第四周 力扣Java 每日一题总结

博主分享了第四周的力扣Java每日一题,包括快速排序相关题目和字节校园每日一题的解题总结。文章介绍了如何使用Java实现排序链表、排序数组,并详细解释了代码逻辑,强调了在面试中快速排序的重要性。还涉及到了其他如颜色分类、链表中倒数第k个节点和随机数生成等题目。
摘要由CSDN通过智能技术生成

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 <
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
力扣第二题是一道链表相关的题目,要求实现一个函数来将两个非负整数链表相加,并返回一个新的链表表示它们的和。 在解决这个问题时,可以设立一个表示进位的变量carried,并建立一个新的链表来存储结果。然后,使用while循环来同时处理两个输入链表,每次取出对应的节点值相加,并将结果加上进位值carried后的值作为一个新节点加入新链表的后面。当遍历完两个链表后,如果最后还有进位,需要再添加一个节点来存储进位的值。最后返回新链表的头节点即可。 下面是使用Java语言编写的实现代码: ```java public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0); int sum = 0; ListNode cur = dummy; ListNode p1 = l1, p2 = l2; while (p1 != null || p2 != null) { if (p1 != null) { sum += p1.val; p1 = p1.next; } if (p2 != null) { sum += p2.val; p2 = p2.next; } cur.next = new ListNode(sum % 10); sum /= 10; cur = cur.next; } if (sum == 1) { cur.next = new ListNode(1); } return dummy.next; } } ``` 以上就是力扣两数相加第二题的Java实现代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Java版】LeetCode 力扣第 2 题:两数相加 (Add Two Numbers)](https://blog.csdn.net/monokai/article/details/108132843)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值