力扣hot100题解(python版13-17题)

13、最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

思路解答:

  1. 状态定义:定义一个状态dp[i],表示以第i个元素结尾的子数组的最大和。
  2. 状态转移方程:状态转移方程为:dp[i] = max(nums[i], dp[i-1] + nums[i]),即要么以第i个元素结尾的子数组最大和是第i个元素本身,要么是第i个元素加上以第i-1个元素结尾的子数组的最大和。
  3. 初始状态:初始状态为dp[0] = nums[0],即以第一个元素结尾的子数组的最大和就是第一个元素本身。
  4. 遍历数组:从第二个元素开始遍历整个数组,根据状态转移方程更新dp数组。
  5. 返回结果:最终返回dp数组中的最大值即为最大子数组的和。
def maxSubArray(self, nums: list[int]) -> int:if not nums:return 0dp = [0] * len(nums)dp[0] = nums[0]max_sum = nums[0]for i in range(1, len(nums)):dp[i] = max(nums[i], dp[i - 1] + nums[i])max_sum = max(max_sum, dp[i])return max_sum

14、合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

思路解答:

  1. 排序:首先对所有区间按照起始位置进行排序。
  2. 合并区间:然后从第二个区间开始,逐个判断当前区间和前一个区间是否重叠,如果重叠则合并,否则将前一个区间加入结果数组。
  3. 返回结果:最终返回合并后的区间数组。
def merge(self, intervals: list[list[int]]) -> list[list[int]]:if not intervals:return []intervals.sort(key=lambda x: x[0])merged = [intervals[0]]for i in range(1, len(intervals)):if intervals[i][0] <= merged[-1][1]:merged[-1][1] = max(merged[-1][1], intervals[i][1])else:merged.append(intervals[i])return merged

15、轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

思路解答:

  1. 整体翻转:将整个数组翻转,这样原数组的后k个元素会变到数组的前面。
  2. 前部翻转:翻转前k个元素,将原数组的后k个元素翻转回来,此时前k个元素已经在正确位置上。
  3. 后部翻转:翻转剩余的n-k个元素,将原数组的前n-k个元素翻转回来,此时整个数组就完成了向右旋转k个位置的操作。
def rotate(self, nums: list[int], k: int) -> None:n = len(nums)k = k % n  # 处理k大于数组长度的情况def reverse(arr, start, end):while start < end:arr[start], arr[end] = arr[end], arr[start]start += 1end -= 1reverse(nums, 0, n - 1)reverse(nums, 0, k - 1)reverse(nums, k, n - 1)

16、除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 **不要使用除法,**且在 O(*n*) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

提示:

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

思路解答:

  1. 左右乘积法:我们可以通过一次遍历来计算每个元素左侧所有元素的乘积,并将结果存储在结果数组中。然后再进行一次反向遍历,计算每个元素右侧所有元素的乘积,并将其与之前计算的左侧乘积相乘,得到最终结果。
def productExceptSelf(self, nums: list[int]) -> list[int]:n = len(nums)answer = [1] * n# 计算每个元素左侧所有元素的乘积left_product = 1for i in range(n):answer[i] *= left_productleft_product *= nums[i]# 计算每个元素右侧所有元素的乘积,并与左侧乘积相乘right_product = 1for i in range(n - 1, -1, -1):answer[i] *= right_productright_product *= nums[i]return answer

17、缺失的第一个正数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n), 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3

示例 2:

输入:nums = [3,4,-1,1]
输出:2

示例 3:

输入:nums = [7,8,9,11,12]
输出:1

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

思路解答:

  1. 将数组调整为哈希表:遍历数组,将每个正整数 nums[i] 调整到正确的位置 nums[nums[i]-1] 上。例如,如果 nums[i] = 3,将 3 调整到索引 2 的位置上。
  2. 再次遍历找出第一个缺失的正整数:再次遍历数组,找出第一个不在正确位置上的正整数,其索引加1即为缺失的最小正整数。
def firstMissingPositive(self, nums: list[int]) -> int:n = len(nums)# 将每个正整数调整到正确的位置上for i in range(n):while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]# 再次遍历找出第一个缺失的正整数for i in range(n):if nums[i] != i + 1:return i + 1return n + 1

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

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

相关文章

stm32单片机的智能手环-心率-步数-距离-体温-蓝牙监控

一.硬件方案 随着社会的发展&#xff0c;人们的物质生活水平日渐提高&#xff0c;人们也越来越关注自己的健康。智能手环作为一种测量仪器&#xff0c;可以计算行走的步数和消耗的能量&#xff0c;所以人们可以定量的制定运动方案来健身&#xff0c;并根据运行情况来分析人体的…

7.(数据结构)堆

7.1 相关概念 堆&#xff08;Heap&#xff09;在计算机科学中是一种特殊的数据结构&#xff0c;它通常被实现为一个可以看作完全二叉树的数组对象。以下是一些关于堆的基本概念&#xff1a; 数据结构&#xff1a; 堆是一个优先队列的抽象数据类型实现&#xff0c;通过完全二叉树…

AI工具新革命:从ChatGPT到Sora,生成式AI改变世界

这个春节着实精彩&#xff0c;“春山学”吃透了&#xff0c;不如把目光移向OpenAI又一重磅产品——文生视频大模型Sora。智能新纪元已然开启&#xff0c;因为正如周鸿祎所说&#xff1a;“,Sora的诞生意味着AGI&#xff08;通用人工智能&#xff09;的实现将从10年缩短到1年。”…

.netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项

1、SqlSugarCore 相关 1.1 主项目添加数据&#xff0c;否则会报数据库连接错误&#xff1a; <InvariantGlobalization>false</InvariantGlobalization> <PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</…

二维码(CTF)misc

知识点&#xff1a;文件剥离zip密码爆破 用到了fcrackzip工具&#xff1a; -b :采用爆破的方式 -c :采用什么类型的密码&#xff0c;1 数字类型 a 小写字母 A 大写字母 ‘aA1’ 大小写字母数字混合等 -l :指定密码的位数 -u :过滤掉不正确的密码记录&#xff1b;只显示正…

前端不传被删记录的id怎么删除记录,或子表如何删除记录

1.删除主表相关子表所有记录 2.再保存一次前端传来的记录 3.如果子表是通过先生成空记录&#xff0c;再put修改模式&#xff0c;可以在执行1和2两步后再拿模板集合和当前现有子表集合套两个for循环对比判断&#xff0c;count记录模板记录和子表记录每次循环重合次数&#xff…

C# winfroms使用socket客户端服务端代码详解

文章目录 1️⃣ 通信相关说明1.1服务端与客户端1.2 信息发送原理1.3 信息接收原理 2️⃣ socket代码2.1 客户端代码2.2 服务端代码 3️⃣ 定时任务处理报文3.1 Timers定时任务 优质资源分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4315141…

滚雪球学Java(71):深入剖析Java中的ArrayBlockingQueue底层实现与源码分析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

每日leetcode--全排列II

问题描述 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个可能包含重复元素的整数数组 nums&#xff0c;编写一个函数来返回所有不重复的全排列 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a;…

vue3 globalData 的使用方法

直接上教程 .新创建一个data.js它可以和main.js平级也可以在store文件夹下面都行&#xff0c;无非就是引用的时候前缀多一个单词少一个单词这样 data.js: 从vue上面引入reactive &#xff0c;然后它可以创建一个也可以创建两个可以任意名称 A或B或C都可以 //data.js import…

SpringMVC 学习(一)之 SpringMVC 介绍

目录 1 MVC 介绍 2 SpringMVC 介绍 2.1 SpringMVC 特点 2.2 SpringMVC 的核心组件 2.3 SpringMVC 执行流程 3 参考文档 1 MVC 介绍 MVC (Model View Controller) 是一种设计思想&#xff0c;它将应用程序分为三大组件&#xff1a;模型 (Model)、视图 (View)、控制器 (Con…

用TensorRT-LLM跑通chatGLM_6B模型

零、参考资料 NVIDIA官网 THUDM的Github NVIDIA的Github 一、构建 TensorRT-LLM的docker镜像 git lfs install git clone https://github.com/NVIDIA/TensorRT-LLM.git cd TensorRT-LLM git submodule update --init --recursive sudo make -C docker release_build sudo m…

在openEuler中通过KVM可视化安装华为FusionCompute的VRM节点

一、说明 本文是华为FusionCompute云平台配置的延续&#xff0c;是在CNA&#xff08;ComputingNode Agent&#xff0c;计算节点代理&#xff09;主机安装配置完成后&#xff0c;详细安装VRM&#xff08;Virtual Resource Manager&#xff0c;虚拟资源管理器&#xff09;节点的…

「JavaSE」String类3:字符串常量池

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 字符串常量池 &#x1f349;常量池&#x1f349;字符串常量池&#x1f349;intern 方法 &#x1f349;常量池 在Java程序中&…

微服务-Alibaba微服务nacos实战

1. Nacos配置中心 1.1 微服务为什么需要配置中心 在微服务架构中&#xff0c;当系统从一个单体应用&#xff0c;被拆分成分布式系统上一个个服务节点后&#xff0c;配置文件也必须跟着迁移&#xff08;分割&#xff09;&#xff0c;这样配置就分散了&#xff0c;不仅如此&…

*MYSQL--索引--内部原理

MYSQL的索引根据功能,主要有三大类型: 1.HASH索引 2.二叉树 3.BTREE索引 一:HASH索引 1.内部原理: 在设置了某列为索引列之后,并且开始或者将要在相应索引列创建数据的时候,系统通过某种算法 F(X) 自动计算出来一个十六进制的哈希值,这个哈希值能够对应相应的字段值 所以…

数据之巅:揭秘企业数据分析师如何成为企业的决策智囊

引言 在数字化浪潮中&#xff0c;企业数据分析师已成为企业决策的重要支撑。他们如同探险家&#xff0c;在数据的丛林中寻找着能够指引企业前行的宝贵信息。本文将深入剖析企业数据分析师的角色、挑战与成就&#xff0c;带你领略这个充满智慧与激情的职业风采。 一、从数字到智…

28-k8s集群中-StatefulSets控制器(进阶知识)

一、statefullsets控制器概述 1&#xff0c;举例 假如&#xff0c;我们有一个deployment资源&#xff0c;创建了3个nginx的副本&#xff0c;对于nginx来讲&#xff0c;它是不区分启动或者关闭的先后顺序的&#xff0c;也就是“没有特殊状态”的一个服务&#xff0c;也成“无状…

【Java】图形、图像与音频(实验十二)

一 、Component组件类中有一个public void paint( Graphics g)绘画方法&#xff0c;只要用户自定义的类继承了此组件类或其子类并重写了paint()方法&#xff0c;当用户自定义的类被实例化后&#xff0c;此时java运行环境就会开启一个新线程来自动调用并执行用户自定义类中的pai…

树莓派更新源,以及安装wiringPi库

1、更换树莓派&#xff08;Raspberry Pi 3B&#xff09;软件源 更换树莓派&#xff08;Raspberry Pi 3B&#xff09;软件源为国内镜像源_树莓派3b更换国内源-CSDN博客 2、安装wiringPi库 安装wiringPi库在树莓派上&#xff0c;可以按照以下步骤进行操作&#xff1a; a.首先&…