力扣爆刷第155天之TOP100五连刷41-45(下一个排列、正序数组中位数、归并排序链表)

news2024/12/27 12:21:44

力扣爆刷第155天之TOP100五连刷41-45(下一个排列、正序数组中位数、归并排序链表)

文章目录

      • 力扣爆刷第155天之TOP100五连刷41-45(下一个排列、正序数组中位数、归并排序链表)
      • 一、31. 下一个排列
      • 二、4. 寻找两个正序数组的中位数
      • 三、232. 用栈实现队列
      • 四、148. 排序链表
      • 五、69. x 的平方根

一、31. 下一个排列

题目链接:https://leetcode.cn/problems/next-permutation/description/
思路:求下一个排列,本意就是字典序,举个例子,如果1、6、5、4、3、2的下个排列就是2、1、3、4、5、6,如果是3、2、1那么下一个排序是1、2、3,这类题目要结合图像来做,所以可以看的出来,要找的是一个转折点,从右向左寻找第一个凸起点,然后把凸起点右边的第一个大于凸起点左边的值进行交换,然后把凸起点开始到结尾的元素都翻转即可。
从下面这个图好好体会。
在这里插入图片描述

class Solution {
    public void nextPermutation(int[] nums) {
        if(nums.length == 1) return ;
        int len = nums.length, k = len-1;
        for(int i = len-2; i >= 0; i--) {
            if(nums[i] < nums[k]) {
                break;
            }
            k--;
        }
        if(k == 0) {
            reverse(nums, 0, len-1);
            return;
        }

        for(int i = len-1; i > k-1; i--) {
            if(nums[i] > nums[k-1]) {
                int t = nums[k-1];
                nums[k-1] = nums[i];
                nums[i] = t;
                reverse(nums, k, len-1);
                break;
            }
        }

    }

    void reverse(int[] nums, int i, int j) {
        while(i < j) {
            int t = nums[i];
            nums[i] = nums[j];
            nums[j] = t;
            i++;
            j--;
        }
    }
}


二、4. 寻找两个正序数组的中位数

题目链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/description/
思路:寻找两个正序数组的中位数,如果向时间复杂度达到log(n + m),解法比较复杂,但是要达到o(n)还是比较简单的,只需要比较并计数即可,从头比较大小,达到总数的二分之一的位置,自然是中位数。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int left = 0, right = 0, n = nums1.length, m = nums2.length;
        int i = 0, j = 0;
        for(int k = 0; k <= (m+n)/2; k++) {
            left = right;
            if((i < n) && (j >= m || nums1[i] < nums2[j])) {
                right = nums1[i++];
            }else {
                right = nums2[j++];
            }
        }
        
        return (m+n) % 2 == 0 ? (left + right) / 2.0 : right;
    }
}


三、232. 用栈实现队列

题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/
思路:这也是经典题目了,用栈实现队列,需要使用两个栈,一个栈专门用来放入元素,一个栈专门用来拿出元素。
只要有元素要添加就加入第一个栈中,只要有元素要出队,都从第二个栈里出,但第二个栈如果空了,就把第一个栈内的所有元素都加入到第二个栈中,正好把先进后出,倒腾了两次,变成了先进先出了。

class MyQueue {
    LinkedList<Integer> stack1 = new LinkedList<>();
    LinkedList<Integer> stack2 = new LinkedList<>();
    public MyQueue() {
        
    }

    public void push(int x) {
        stack1.push(x);
    }

    public int pop() {
        if(stack2.isEmpty()) {
            while(!stack1.isEmpty()) stack2.push(stack1.pop());
        }
        return stack2.pop();
    }

    public int peek() {
        if(stack2.isEmpty()) {
            while(!stack1.isEmpty()) stack2.push(stack1.pop());
        }
        return stack2.peek();
    }

    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }
}

四、148. 排序链表

题目链接:https://leetcode.cn/problems/sort-list/description/
思路:排序链表,使用归并排序,只需要先递归分割链表成单个节点,然后再归并单个节点即可。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        return cutList(head, null);
    }

    
    ListNode cutList(ListNode start, ListNode end) {
        if(start == null) return start;
        if(start.next == end) {
            start.next = null;
            return start;
        }
        ListNode slow = start, fast = start;
        while(fast != end) {
            slow = slow.next;
            fast = fast.next;
            if(fast != end) {
                fast = fast.next;
            }
        }
        ListNode left = cutList(start, slow);
        ListNode right = cutList(slow, end);
        return merge(left, right);
    }
    
    ListNode merge(ListNode root1, ListNode root2) {
        ListNode root = new ListNode();
        ListNode p = root;
        while(root1 != null && root2 != null) {
            if(root1.val < root2.val) {
                p.next = root1;
                root1 = root1.next;
            }else{
                p.next = root2;
                root2 = root2.next;
            }
            p = p.next;
        }
        if(root1 != null) p.next = root1;
        if(root2 != null) p.next = root2;
        return root.next;
    }
}

五、69. x 的平方根

题目链接:https://leetcode.cn/problems/sqrtx/description/
思路:直接二分查找,没什么好说的。但注意不要用乘法,尽量用除非和减法。

class Solution {
    public int mySqrt(int x) {
        if(x <= 1) return x;
        int left = 1, right = x/2;
        while(left <= right) {
            int mid = left + (right - left) / 2;
            int t = x/mid;
            if(t == mid) return mid;
            else if(mid < t) left = mid+1;
            else right = mid-1;
        }
        return right;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1868566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基于逻辑回归分类模型、决策树分类模型、LightGBM分类模型和XGBoost分类模型实现车辆贷款违约预测项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着经济的发展和人民生活水平的提高&#xff0c;汽车消费在居民消费中所占比例逐渐增加&#xff0c;汽…

【Linux】CentOS7重置登录密码

一、具体步骤 1、启动虚拟机&#xff0c;进入下方页面时选择第一个选项&#xff0c;并按e 2、在下方界面 添加 init/bin/sh,刚开始进来可能看不到&#xff0c;需要按下键盘的↓键。 3、填写完成后ctrlx保存 4、输入mount -o remount, rw / 5、输入passwd 用户名;输入后出现…

澳汰尔(Altair® )FlowSimulator™ 集成热流体系统设计

FlowSimulator 是一款 3D 设计工具&#xff0c;可为 CAD 集成环境中的流体和热系统提供跨学科建模和优化。 系统级设计变得越来越重要&#xff0c;因为企业正在面临仿真复杂工作周期的挑战。需要采用 FlowSimulator 等快速软件解决方案对整个系统进行建模&#xff0c;包括对快…

VAE-pytorch代码

import osimport torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import DataLoaderfrom torchvision import transforms, datasets from torchvision.utils import save_imagefrom tqdm import tqdmclass VAE(nn.Module): # 定义VAE模型…

【AI大模型】Transformers大模型库(十四):Datasets Viewer

目录 一、引言 二、Datasets Viewer数据查看器 2.1 概述 2.2 示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服务。 &#x1f917; Transformers 提供了数以千计的预训练…

python-立方和不等式

[题目描述] 试求满足下述立方和不等式的 m 的整数解。 1^32^3...m^3≤n。本题算法如下&#xff1a; 对指定的 n&#xff0c;设置求和循环&#xff0c;从 i1 开始&#xff0c;i 递增1取值&#xff0c;把 i^3 (或 i∗i∗i)累加到 s&#xff0c;直至 s>n&#xff0c;脱离循环作…

VMware Workstation环境下,邮件(E-Mail)服务的安装配置,并用Windows7来验证测试

需求说明: 某企业信息中心计划使用IP地址17216.11.0用于虚拟网络测试,注册域名为xyz.net.cn.并将172.16.11.2作为主域名的服务器(DNS服务器)的IP地址,将172.16.11.3分配给虚拟网络测试的DHCP服务器,将172.16.11.4分配给虚拟网络测试的web服务器,将172.16.11.5分配给FTP服务器…

深度學習筆記14-CIFAR10彩色圖片識別(Pytorch)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、我的環境 電腦系統&#xff1a;Windows 10 顯卡&#xff1a;NVIDIA GeForce GTX 1060 6GB 語言環境&#xff1a;Python 3.7.0 開發…

ubuntu 18.04 server源码编译安装freeswitch 1.10.7支持音视频通话、收发短信——筑梦之路

软件版本说明 ubuntu版本18.04&#xff1a;https://releases.ubuntu.com/18.04.6/ubuntu-18.04.6-live-server-amd64.iso freeswitch 版本1.10.7&#xff1a;https://files.freeswitch.org/freeswitch-releases/freeswitch-1.10.7.-release.tar.gz spandsp包&#xff1a;https:…

家人们谁懂啊?手机信息删除找不回,原来3个技巧就能恢复

你是否也曾经遇到过这样的情况&#xff1a;手机里的重要信息不小心删除了&#xff0c;翻遍所有地方都找不到&#xff0c;心情烦躁到了极点。其实&#xff0c;信息删除后找回它们并不像你想象的那么复杂。不要担心&#xff0c;因为今天我将与你分享3个技巧&#xff0c;帮助你轻松…

1 哈希应用

O(1) 的哈希 Python中的哈希表主要通过内置的字典&#xff08;dict&#xff09;类型实现。对于字典的操作&#xff0c;包括插入&#xff08;insert&#xff09;、删除&#xff08;delete&#xff09;和查找&#xff08;lookup&#xff09;的时间复杂度&#xff0c;在理想情况下…

上位机图像处理和嵌入式模块部署(mcu之iap升级)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 mcu种类很多&#xff0c;如果是开发的时候需要对固件升级&#xff0c;整体还是比较容易的。不管是dap&#xff0c;还是st-link v2、j-link&#xf…

idea中使用springboot进行开发时遇到的工程结构问题汇总

idea中的工程结构和eclipse中不同&#xff0c;但是配置的内容都是一样的。 IDEA中也就是这个页面&#xff0c;快捷键ctrlaltshifts 如果在eclipse中&#xff0c;经常会遇到jre和jdk不正确的情况&#xff0c;但IDEA中这个问题很少&#xff0c;但是IDEA中会经常由于未正常配置根…

ESXI存储设备已经分区,无法创建数据存储。

问题:ESXi 存储设备已经分区完成&#xff0c;并且有 VMFS 文件系统&#xff0c;无法创建数据存储&#xff0c;选项是灰色。 解决办法&#xff1a;通过命令行工具 在现有的 VMFS 分区上创建数据存储。 在现有的 VMFS 分区上创建数据存储 1.ESXI开SSH2.windows自带CMD登入ESXI。&…

使用宝塔安装ModstartCMS (非一键安装)

操作系统 Linux Windows 推荐 Linux 操作系统&#xff0c;性能比较好 软件环境 稳定版 PHP 5.6 PHP 7.0 MySQL >5.0 PHP Extension&#xff1a;Fileinfo Apache/Nginx Laravel 9.0 版本 PHP 8.1 MySQL >5.0 PHP Extension&#xff1a;Fileinfo Apache/Ngin…

Windows 注册表是什么?如何备份注册表?

Windows注册表&#xff08;Windows Registry&#xff09;是微软Windows操作系统中的一个重要组件&#xff0c;用于存储系统和应用程序的配置信息和选项。下面就给大家详细讲解一下什么是注册表。 注册表的概念 Windows 注册表是一个集中管理的数据库&#xff0c;存储了系统、…

安霸CVFlow推理开发笔记

一、安霸环境搭建&#xff1a; 1.远程172.20.62.13 2. 打开Virtualbox&#xff0c;所在目录&#xff1a;E:\Program Files\Oracle\VirtualBox 3. 配置好ubuntu18.04环境&#xff0c;Ubuntu密码&#xff1a;amba 4. 安装toolchain&#xff0c;解压Ambarella_Toolchain_CNNGe…

成都工业学院2022级数据库原理及应用专周课程学生选课系统(基础篇)

运行环境 操作系统&#xff1a;Windows 11 家庭版 运行软件&#xff1a;Navicat Premium 16 项目内容 需求分析 学生&#xff1a;选课、退课、查看课程信息、查看选课情况等操作 教师&#xff1a;查看选课名单等操作 管理员&#xff1a;课程管理等操作 实体关系模式图 关…

js计算某个时间距离当前时间多少天,少于7天红色展示

效果图 后端返回数据格式 info:{vip_validity:"2027-09-07" }<div>到期时间&#xff1a;{{ info.vip_validity }}, 剩余<span :class"countdownDays(info.vip_validity) < 7 ? surplus : ">{{ !!info.vip_validity ? countdownDays(inf…

MySQL进阶-索引-使用规则-索引失效情况一(索引列运算,字符串不加引号,头部模糊匹配)

文章目录 1、索引列运算1.1、查询表tb_user1.2、查看tb_user的索引1.3、查询 phone177999900151.4、执行计划 phone177999900151.5、查询 substring(phone,10,2) 151.6、执行计划 substring(phone,10,2) 15 2、字符串不加引号2.1、查询 phone177999900152.2、执行计划 phone177…