2023.07.13力扣6题

news/2024/4/20 12:12:10/文章来源:https://blog.csdn.net/qq_43978754/article/details/131710679

931. 下降路径最小和

给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。

下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置(row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

示例 1

在这里插入图片描述

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径示例 2

在这里插入图片描述

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径提示:n == matrix.length == matrix[i].length
1 <= n <= 100
-100 <= matrix[i][j] <= 100

dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])

class Solution {public int minFallingPathSum(int[][] matrix) {//d[i][j]=min(d[i-1][j-1],d[i-1][j],d[i-1][j+1])+matrix[i][j]int ans=Integer.MAX_VALUE;int n=matrix.length;int[][] dp=new int[n][n];if(n==1) return matrix[0][0];for(int i=0;i<n;i++) {dp[0][i] = matrix[0][i];}for(int i=1;i<n;i++){for(int j=0;j<n;j++){if(j==0){dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j+1]);}else if(j==n-1){dp[i][j]=Math.min(dp[i-1][j-1],dp[i-1][j]);}else{dp[i][j]=Math.min(Math.min(dp[i-1][j-1],dp[i-1][j]),dp[i-1][j+1]);}dp[i][j]+=matrix[i][j];if(i==n-1){ans=Math.min(ans,dp[i][j]);}}}return ans;}
}

979. 在二叉树中分配硬币

给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。

在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点,或者从子结点移动到父结点)。

返回使每个结点上只有一枚硬币所需的移动次数。

示例 1:
在这里插入图片描述


输入:[3,0,0]
输出:2
解释:从树的根结点开始,我们将一枚硬币移到它的左子结点上,一枚硬币移到它的右子结点上。

示例 2:
在这里插入图片描述

输入:[0,3,0]
输出:3
解释:从根结点的左子结点开始,我们将两枚硬币移到根结点上 [移动两次]。然后,我们把一枚硬币从根结点移到右子结点上。

示例 3:
在这里插入图片描述

输入:[1,0,2]
输出:2

示例 4:
在这里插入图片描述

输入:[1,0,0,null,3]
输出:4提示:1<= N <= 100
0 <= node.val <= N

581. 最短无序连续子数组

给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的 最短 子数组,并输出它的长度。

示例 1:输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。示例 2:输入:nums = [1,2,3,4]
输出:0示例 3:输入:nums = [1]
输出:0提示:1 <= nums.length <= 104
-105 <= nums[i] <= 105进阶:你可以设计一个时间复杂度为 O(n) 的解决方案吗?

方法一:时间复杂度O(n^2)

public static int findUnsortedSubarray(int[] nums) {//从左侧开始遍历找第一个存在右侧元素大于它的,它便为升序排序最左侧元素//再从右侧开始遍历找第一个存在左侧元素小于它的,它便为升序排序最右侧元素int n=nums.length;int indexLeft=-1,indexRight=n;for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(nums[i]>nums[j]){indexLeft=i;break;}}if(indexLeft!=-1){break;}}//原序列已经是个升序序列if(indexLeft==-1){return 0;}for(int i=n-1;i>0;i--){for(int j=i-1;j>=0;j--){if(nums[i]<nums[j]){indexRight=i;break;}}if(indexRight!=n){break;}}return indexRight-indexLeft+1;}

方法二:时间复杂度O(n)

我提供一个我的理解(有点贪心的感觉):首先,我们希望这个数组是单调递增的(不是严格单调递增,相邻可以相等)
从左往右,一开始max是第一个数。如果数组符合要求,那么遍历的每一个数都只会相等或者越来越大,也就是我们只会不停地更新max的值。但是,一旦碰到一个小于max的数,就说明这个数字的位置不对,这个数字一定是在我们最终要重新sort的subarray里的,并且是右边界(因为我们在不断向右探索)。
从右往左同理,只是大小关系反一反,我们能找到需要重新sort的subarray的左边界。这样就找到答案了。

法二的理解

从左往右遍历,遍历到i,max记录的是从0到i最大的数,如果第i个位置比max小,证明第i位置元素处在一个不正确的位置(因为它前面有个比它大的数),记录下标high。

从右往左遍历,遍历到i,min记录的是从末尾元素到i元素最小的数,如果第i位置元素比min大了,证明第i位置元素也处在一个不正确的位置(因为它后面有比它小的数),记录下标low。

计算两个不正确的位置low和high之间的距离。

public static int findUnsortedSubarray(int[] nums) {//单调栈,或者也可以不用单调栈,直接用两个数max和min去维护int n=nums.length;int indexLeft=-1,indexRight=n;Deque<Integer> deque=new ArrayDeque<>();deque.addFirst(0);for(int i=1;i<n;i++){if(!deque.isEmpty()&&nums[i]>nums[deque.getLast()]) deque.addLast(i);if(!deque.isEmpty()&&nums[i]<nums[deque.getLast()]){indexRight=i;}}deque.clear();deque.addFirst(n-1);for(int i=n-2;i>=0;i--){if(!deque.isEmpty()&&nums[i]<nums[deque.getLast()]) deque.addLast(i);if(!deque.isEmpty()&&nums[i]>nums[deque.getLast()]){indexLeft=i;}}if(indexLeft==-1||indexRight==n) return 0;return indexRight-indexLeft+1;}

2208. 将数组和减半的最少操作次数

给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好
一半。(注意,在后续操作中你可以对减半过的数继续执行操作)

请你返回将 nums 数组和 至少 减少一半的 最少 操作数。

示例 1:输入:nums = [5,19,8,1]
输出:3
解释:初始 nums 的和为 5 + 19 + 8 + 1 = 33 。
以下是将数组和减少至少一半的一种方法:
选择数字 19 并减小为 9.5 。
选择数字 9.5 并减小为 4.75 。
选择数字 8 并减小为 4 。
最终数组为 [5, 4.75, 4, 1] ,和为 5 + 4.75 + 4 + 1 = 14.75 。
nums 的和减小了 33 - 14.75 = 18.25 ,减小的部分超过了初始数组和的一半,18.25 >= 33/2 = 16.5 。
我们需要 3 个操作实现题目要求,所以返回 3 。
可以证明,无法通过少于 3 个操作使数组和减少至少一半。示例 2:输入:nums = [3,8,20]
输出:3
解释:初始 nums 的和为 3 + 8 + 20 = 31 。
以下是将数组和减少至少一半的一种方法:
选择数字 20 并减小为 10 。
选择数字 10 并减小为 5 。
选择数字 3 并减小为 1.5 。
最终数组为 [1.5, 8, 5] ,和为 1.5 + 8 + 5 = 14.5 。
nums 的和减小了 31 - 14.5 = 16.5 ,减小的部分超过了初始数组和的一半, 16.5 >= 31/2 = 16.5 。
我们需要 3 个操作实现题目要求,所以返回 3 。
可以证明,无法通过少于 3 个操作使数组和减少至少一半。提示:1 <= nums.length <= 105
1 <= nums[i] <= 107

采用java中自带的接口优先队列:PriorityQueue,其内部是默认小根堆存储的,可以根据需求更改成大根堆

class Solution {public int halveArray(int[] nums) {int res = 0;double sum = 0, subNum = 0;PriorityQueue<Double> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());  //默认小根堆,本题需要使用的是大根堆for (int num : nums) {sum += num;priorityQueue.offer(num * 1.0);}sum = sum / 2.0;while(subNum<sum){double n=priorityQueue.poll();subNum+=n/2.0;priorityQueue.offer(n/2.0);res++;}return res;}
}

141. 环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

在这里插入图片描述

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

在这里插入图片描述

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

在这里插入图片描述

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。提示:链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。

法一:简单但是耗费内存,内存为O(n)

public boolean hasCycle(ListNode head) {//断链法List<ListNode> list=new ArrayList<>();ListNode node=head,nodeNext=null;while(node!=null){nodeNext=node.next;node.next=null;if(list.contains(node)) {return true;}list.add(node);node=nodeNext;}return false;}

法二:快慢指针法,经典解决链表中有环的问题

public boolean hasCycle(ListNode head) {//追赶法--->快慢指针法,两个指针都在环里面的时候相差一个环那么多的时候一定会相遇//并且快指针比慢指针每次多走一步,所以一定会相遇ListNode fast=head,slow=head;while(fast!=null&&fast.next!=null){  //不用管slow,fast永远在它前面保驾护航fast=fast.next.next;  //兔子走两步slow=slow.next;       //乌龟走一步if(fast==slow) return true;  //相遇}return false;    //没有环}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】无头+单向+非循环链表(SList)(增、删、查、改)详解

一、链表的概念及结构 1、链表的概念 之前学习的顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;而链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的&#xff0c;可以实现更加…

SpringBoot项目连接数据库

1、找到applications.yml&#xff0c;如下图 2、写入代码 server:port: 9494spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/自己的数据库表名?serverTimezoneGMT%2b8username: rootpassword: root

[C语言] 数组

1. 一维数组的创建和初始化 2. 一维数组的使用 3. 一维数组在内存中的存储 4. 二维数组的创建和初始化 5. 二维数组的使用 6. 二维数组在内存中的存储 7. 数组越界 8. 数组作为函数参数 9. 数组的应用实例 1 &#xff1a;三子棋 10. 数组的应用实例 2 &#…

Spring Tool Suite 4

参考&#xff1a;Spring tool suite4 安装及配置_springtoolsuite4_猿界零零七的博客-CSDN博客 下载&#xff1a;Spring | Tools 将下载的JAR进行解压两次&#xff0c;直至解压出contents中的sts 双击启动 第一次打开需要指定工作区文件夹 配置Maven的config 安装插件

Pytorch学习笔记1:张量+训练参数传入与处理+制作训练集

文章目录 Pytorch中张量的一些常见函数最基础也最常见的方法关于Indexing, Slicing, Joining, Mutating Ops&#xff08;索引、切片、聚合、旋转&#xff09;随机种子torch.bernoulli(input)torch.normaltorch.rand(size)torch.randn(size)torch.randperm(n) Python--argparse-…

Hexo+GithubPages免费搭建个人博客网站

HexoGithubPages免费搭建个人博客网站 目录 一、前言二、Github配置 新建同名仓库配置Pages 三、安装Hexo四、配置hexo-deployer-git五、访问六、发布文章七、安装主题 一、前言 我之前开了好几年的云服务器了&#xff0c;实际上使用场景并不是很多&#xff0c;感觉有点浪费…

什么叫前后端分离?为什么需要前后端问题?解决了什么问题?

单体架构出现的问题 引出&#xff1a;来看一个单体项目架构的结构 通过上述可以看到单体架构主要存在以下几点问题&#xff1a; 开发人员同时负责前端和后端代码开发&#xff0c;分工不明确开发效率低前后端代码混合在一个工程中&#xff0c;不便于管理对开发人员要求高(既会前…

网络层中一些零碎且易忘的知识点

异构网络&#xff1a;指传输介质、数据编码方式、链路控制协议以及数据单元格式和转发机制不同&#xff0c;异构即物理层和数据链路层均不同RIP、OSPF、BGP分别是哪一层的协议&#xff1a; -RIPOSPFBGP所属层次应用层网络层应用层封装在什么协议中UDPIPTCP 一个主机可以有多个I…

Manjaro KDE 22.1.3vmware无法复制文件

Wayland 是 X11 的现代替代品&#xff0c;几十年来 X11 一直是 Linux 上的默认窗口系统。 Wayland 是一种通信协议&#xff0c;定义 X Window 显示服务器和客户端应用程序之间的消息传递。 软件还不兼容 使用X11即可

HCIP重发布实验

目录 实验要求&#xff1a; 步骤一&#xff1a;拓扑设计IP地址规划 拓扑设计 R1 R2 R3 R4 发布路由 R1 R2 R3 R4 双向重发布 在R2和R4 上进行 R2 R4 检查R1 修改开销值选路 择优选择去4.0网段的路径 测试&#xff1a;​编辑 择优选择去32网段的路径 测试&…

Stable Diffusion 开源模型 SDXL 1.0 发布

关于 SDXL 模型&#xff0c;之前写过两篇&#xff1a; Stable Diffusion即将发布全新版本Stable Diffusion XL 带来哪些新东西&#xff1f; 一晃四个月的时间过去了&#xff0c;Stability AI 团队终于发布了 SDXL 1.0。当然在这中间发布过几个中间版本&#xff0c;分别是 SDXL …

Codeforces算法心得——A. Escalator Conversations

大家好&#xff0c;我是晴天学长&#xff0c;今天开始尝试一些外国的题目了&#xff0c;不得不说&#xff0c;创新性挺高的&#xff0c;然后是全英文&#xff0c;也可以练练英文的水平&#xff0c;后面我会持续的更新的&#xff01;加油&#xff01;&#x1f4aa;&#x1f4aa;…

【Java】使用JDBC操作MySQL 8(快速入门+详解)

文章目录 1. JDBC概述2. JDBC快速入门2.1 下载驱动jar包2.2 数据准备2.3 创建工程2.4 编写代码 3. JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行SQL对象3.2.1 管理事务 3.3 Statement3.3.1 执行DML语句3.3.2 执行DDL语句 3.4 ResultSet3.4.1 ResultSet对象方法3…

python下的control库使用

文章目录 control的官方网站函数示例强迫响应forced_response control的官方网站 函数示例 强迫响应forced_response import numpy as np import os import sys import control as ctrl import matplotlib.pyplot as pltdef lim_x(x, lim0):res 0if x > lim:res 1else:…

FL Studio 21官方中文版功能介绍及2023最新下载详细图文安装激活教程。FL Studio 21需要系统配置要求

FL Studio 21版本更新现已发布&#xff0c;在这次更新中优化了很多功能&#xff0c;但这些现在都不重要&#xff0c;FL Studio21版本的这次更新中令人瞩目的更新莫过于对简体中文版的支持了。以前FL Studio只有英文版&#xff0c;想要用上中文版只有用汉化包&#xff0c;而且有…

数字化新时代,VR全景拍摄与制作

导语&#xff1a; 随着科技的飞速发展&#xff0c;数字化图片正在引领新的时代潮流。在这个数字化图片的新时代&#xff0c;VR全景拍摄与制作技术正以其独特的特点和无限的优势&#xff0c;成为数字影像领域的一颗璀璨明星。让我们深入了解VR全景拍摄与制作的特点和优势&#…

QT:手动实现登录框

要求&#xff1a; 1、登录窗口更改标题、图标 2、设置固定尺寸、并给定一定的透明度 #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->setFixedSize(800,650); //设置固定尺寸qDebug()<<this->windowT…

线性代数(应用篇):第五章:特征值与特征向量、第六章:二次型

文章目录 第5章 特征值与特征向量、相似矩阵(一) 特征值与特征向量1.定义2.性质3.求解(1)具体型矩阵试根法、多项式带余除法&#xff1a;三阶多项式分解因式 (2)抽象型矩阵 (二) 相似1.矩阵相似(1)定义(2)性质 2.相似对角化(1)定义(2)相似对角化的条件&#xff08;n阶矩阵A可相…

Java的标记接口(Marker Interface)

Java中的标记接口&#xff08;Marker Interface&#xff09;是一个空接口&#xff0c;接口内什么也没有定义。它标识了一种能力&#xff0c;标识继承自该接口的接口、实现了此接口的类具有某种能力。 例如&#xff0c;jdk的com.sun.org.apache.xalan.internal.xsltc.trax.Temp…

aardio - 关于 loadcode 和 loadcodex 的用法

关于 loadcode 和 loadcodex 的用法&#xff0c;资料较少&#xff0c;我简单写了几种用法&#xff0c;作为抛砖引玉。 大家还有其他使用技巧&#xff0c;请跟帖&#xff1a; import consoletest1 /** myTestFunc1 function(){ return myFunc1; } **/ loadcodex(test1); co…