力扣刷题之旅:进阶篇(一)

         力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。 

--点击进入刷题地址 


题目1:三数之和

题目描述:

        给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c ,使得a + b + c = 0 ?找出所有满足条件且不重复的三元组。

代码实现:

def threeSum(nums):  res = []  n = len(nums)  for i in range(n-2):  if i > 0 and nums[i] == nums[i-1]:  continue  left = i + 1  right = n - 1  while left < right:  total = nums[i] + nums[left] + nums[right]  if total == 0:  res.append([nums[i], nums[left], nums[right]])  while left < right and nums[left] == nums[left+1]:  left += 1  while left < right and nums[right] == nums[right-1]:  right -= 1  left += 1  right -= 1  elif total < 0:  left += 1  else:  right -= 1  return res

解题思路:

  •         这个问题是一个经典的数组问题,要求在给定的整数数组中找到所有和为特定目标值的三元组。我们需要遍历数组中的所有可能的三元组,并检查它们的和是否等于目标值。
  •         由于题目要求返回所有不重复的三元组,我们需要使用一个集合来存储已经找到的三元组,以便在找到重复的三元组时将其跳过。在遍历数组时,我们可以使用两个指针i和j来分别指向数组中的第一个和第二个数,然后使用第三个指针k从数组的末尾向前遍历。这样我们可以保证每次找到的三元组的第一个数都不相同,从而避免了重复。
  •         在找到一个和为目标值的三元组后,我们可以将其添加到结果数组中,并继续遍历数组,直到找到所有的三元组为止。
  •         需要注意的是,为了避免重复的三元组,我们需要跳过重复的元素。具体来说,当i和j指向的元素相同时,我们需要跳过它们,继续遍历数组。
  • 最后,我们返回结果数组即可。

题目2:三数之和 II

题目描述: 

        给定一个包含n个整数的数组nums,其中每个元素的值介于1到1000之间。找出nums中同时满足下列三个条件的所有三个整数num1、num2和num3:num1 + num2 + num3 = target,num1 < num2 < num3,num1、num2、num3均不相同。返回所有不重复的三元组。要求时间复杂度为O(n^2)。

解题思路:

        这个问题可以使用三重循环遍历数组来解决。首先,我们定义三个指针i、j和k,分别指向数组中的起始位置、第二个数和第三个数。然后,我们使用三重循环遍历数组中的所有可能的三元组,并检查是否满足条件具体来说,我们检查i、j和k指向的三个数是否满足条件,如果满足条件则将它们作为一个三元组添加到结果中最后返回所有不重复的三元组即可。

代码实现:

def threeSum(nums, target):  res = []  n = len(nums)  for i in range(n):  for j in range(i+1, n):  for k in range(j+1, n):  if nums[i] + nums[j] + nums[k] == target and nums[i] != nums[j] != nums[k]:  res.append([nums[i], nums[j], nums[k]])  return res

题目3:矩阵中的路径

        给定一个二维矩阵,其中0表示空地,1表示障碍物。从左上角开始,要走到右下角只能向右或向下走,问从左上角走到右下角有多少种不同的路径?

解题思路:

这个问题可以使用动态规划来解决。我们可以定义一个二维数组dp,其中dp[i][j]表示从左上角走到位置(i, j)的路径数。对于位置(0, 0),它只有一种路径,即dp[0][0] = 1。对于其他位置,如果它没有被障碍物阻挡,则可以从上方或左方走到该位置,即dp[i][j] = dp[i-1][j] + dp[i][j-1]。如果它被障碍物阻挡,则无法从上方或左方走到该位置,即dp[i][j] = 0。最后返回dp[n-1][m-1],其中n和m分别为矩阵的行数和列数。

代码实现:

def uniquePaths(matrix):  if not matrix:  return 0  n, m = len(matrix), len(matrix[0])  dp = [[0] * m for _ in range(n)]  dp[0][0] = 1  for i in range(n):  for j in range(m):  if matrix[i][j] == 1:  continue  if i > 0:  dp[i][j] += dp[i-1][j]  if j > 0:  dp[i][j] += dp[i][j-1]  dp[i][j] -= dp[i-1][j-1] if i > 0 and j > 0 else 0  return dp[n-1][m-1]

 

题目4:旋转图像

给定一个m x n的矩阵matrix,将其旋转90度并返回结果。旋转后的矩阵应该是一个n x m的矩阵。

解题思路:

这个问题可以使用分治法来解决。我们可以将矩阵分成四个部分:左上角、右上角、右下角和左下角。首先,我们分别对左上角和右上角、左下角和右下角进行旋转操作。然后,我们将左上角和右上角、左下角和右下角的结果合并在一起,得到最终的旋转后的矩阵。具体步骤如下:

  1. 对左上角和右上角进行旋转操作:将左上角的m x m矩阵旋转90度,得到一个m x m的矩阵。同时,将右上角的(n-m) x (n-m)矩阵旋转90度,得到一个(n-m) x (n-m)的矩阵。这样,左上角和右上角的区域就得到了旋转后的结果。
  2. 对左下角和右下角进行旋转操作:将左下角区域的(m-n) x m矩阵旋转90度,得到一个m x (m-n)的矩阵。同时,将右下角的(n-m) x (n-m)矩阵旋转90度,得到一个(n-m) x (n-m)的矩阵。这样,左下角和右下角的区域就得到了旋转后的结果。
  3. 将左上角和右上角、左下角和右下角的区域合并在一起,得到最终的旋转后的矩阵。
def rotateImage(matrix):  n = len(matrix)  # 遍历每个元素,将其与对应的对称位置的值进行交换  for i in range(n):  for j in range(i+1, n):  matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]  return matrix

 

题目5:最长递增子序列II

给定一个未排序的整数数组nums,找到最长递增子序列的长度。要求时间复杂度为O(nlogn),且空间复杂度为O(1)。

解题思路:

这个问题可以使用动态规划结合单调栈来解决。首先,我们可以使用单调栈来找到每个元素前面比它小的元素的位置。具体来说,我们可以使用一个栈来维护数组中的元素,遍历数组时,如果当前元素大于栈顶元素,则将栈顶元素弹出,直到找到一个小于等于当前元素的元素或者栈为空为止。然后,我们遍历数组中的每个元素,对于每个元素,我们找到它前面比它小的元素的位置,并更新dp数组。最后返回dp数组中的最大值即可。

代码实现:

def lengthOfLIS(nums):  n = len(nums)  if n == 0:  return 0  dp = [1] * n  stack = []  for i in range(n):  while stack and nums[i] > nums[stack[-1]]:  stack.pop()  if not stack:  dp[i] = 1  else:  dp[i] = dp[stack[-1]] + 1  stack.append(i)  return max(dp)

 

题目6:最大子序和

给定一个整数数组nums,求数组中连续子序列的最大和。要求使用Kadane算法,时间复杂度为O(n)。

解题思路:

这个问题可以使用Kadane算法来解决。Kadane算法的核心思想是维护一个当前的最大子序列和,初始时为0。遍历数组中的每个元素,如果当前元素大于0,则将其加入到当前最大子序列和中,否则将其与当前最大子序列和相减。最后返回最大子序列和即可。

代码实现:

def maxSubArray(nums):  if not nums:  return 0  max_sum = nums[0]  current_sum = nums[0]  for i in range(1, len(nums)):  if nums[i] > 0:  current_sum += nums[i]  else:  current_sum = nums[i]  max_sum = max(max_sum, current_sum)  return max_sum

        这些题目属于中等难度的算法题,主要涉及矩阵操作、路径寻找、子序列和的最大值、三数之和的条件求解等方面的知识和技巧。解题过程中需要运用循环、递归、动态规划等算法和数据结构,以及一些数学推理和逻辑分析的方法。通过解决这些题目,可以提高编程能力和算法设计水平,加深对数据结构和算法的理解和应用。 

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

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

相关文章

代码随想录算法训练营第41天 | 343.整数拆分 + 96.不同的二叉搜索树

今日任务 343. 整数拆分 96.不同的二叉搜索树 343.整数拆分 - Medium 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0…

springboot+vue实现excel导出

后端 导入pom依赖 <dependency>x<groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.2.0</version> </dependency> Entity实体类 这里以User为例&#xff0c;可按照自己实际…

vulhub中AppWeb认证绕过漏洞(CVE-2018-8715)

AppWeb是Embedthis Software LLC公司负责开发维护的一个基于GPL开源协议的嵌入式Web Server。他使用C/C来编写&#xff0c;能够运行在几乎先进所有流行的操作系统上。当然他最主要的应用场景还是为嵌入式设备提供Web Application容器。 AppWeb可以进行认证配置&#xff0c;其认…

【CSS】css如何实现字体大小小于12px?

【CSS】css如何实现字体大小小于12px? 问题解决方案transform: scale(0.5)&#xff08;常用&#xff09;SVG 矢量图设置text 问题 文字需要显示为12px&#xff0c;但是小于12px的&#xff0c;浏览器是显示不来的 解决方案 transform: scale(0.5)&#xff08;常用&#xff0…

树莓派-Ubuntu22.04

树莓派 1 安装Ubuntu系统2 ssh登录3 配置3.1 安装软件3.2 换源3.3 安装桌面3.4 开机脚本 1 安装Ubuntu系统 通过制作sdk&#xff0c;使系统在sdk中运行&#xff1a; 下载制作软件&#xff1a;https://www.raspberrypi.com/software/ 下载Ubuntu镜像&#xff1a;https://cn.ub…

【Day40】代码随想录之动态规划_343. 整数拆分_96.不同的二叉搜索树

文章目录 动态规划理论基础动规五部曲&#xff1a;出现结果不正确&#xff1a; 343. 整数拆分96.不同的二叉搜索树 动态规划理论基础 动规五部曲&#xff1a; 确定dp数组 下标及dp[i] 的含义。递推公式&#xff1a;比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化dp数组。…

基于Springboot开发的JavaWeb作业查重系统[附源码]

基于Springboot开发的JavaWeb作业查重系统[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &a…

zlib交叉编译(rv1126)

目录 1.下载 2.解压 3.配置 4.编译 1.下载 1)下载地址 zlib Home Site 2)下载tar.gz版本 下载该版本。 2.解压 1)解压到某个文件夹

探索设计模式的魅力:从单一继承到组合模式-软件设计的演变与未来

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 在面对层次结构和树状数据结构的软件设计任务时&#xff0c;我们如何优雅地处理单个对象与组合对象的一致性问题&#xff1f;组合模式&#xff08;Composite Pattern&#xff09;为此提供了一种简洁高效的解决方案。通过本…

简单的JavaScript去下载转换为Base64的PDF文件

新建一个文件&#xff0c;内容填写如下&#xff0c;然后保存为 .html 类型的文件 再用浏览器打开&#xff0c;就会是下面这样子&#xff1a; 图一红色textarea里面&#xff0c;可以将PDF文件转换成BASE64位后的内容贴进去&#xff0c;点击下载时&#xff0c;就可以直接下载成PD…

进程的基本概念、查看、创建

1. 进程的概念 概念&#xff1a;加载到内存的程序/正在运行的程序称为内存。 我们在玩电脑的时候是可以启动多个程序的&#xff0c;比如边听歌边写博客&#xff0c;根据上篇文章我们知道肯定要将多个.exe文件加载到内存中&#xff0c;作为操作系统肯定是要管理这多个加载到内存…

开源大数据集群部署(十)Ranger usersync部署

作者&#xff1a;櫰木 ranger usersync部署 解压包 [roothd1.dtstack.com ranger]# pwd /opt/ranger [roothd1.dtstack.com ranger]# tar -zxvf ranger-2.3.0-usersync.tar.gz -C /opt/ [roothd1.dtstack.com ranger]# cd ranger-2.3.0-usersync修改配置install.properties…

小白Linux学习笔记-Linux开机启动流程

Linux 开机启动流程 文章目录 Linux 开机启动流程启动流程概览详细讲解开机软件 —— BIOS、Grub名词解释流程解释BIOS 开机文档 —— menu.lst、grub.confGrub 配置文档流程解释 init 程序流程解释init 执行的相关文件 run-level(启动等级) 相关的命令实验rhel6 单用户模式修改…

改变终端安全的革命性新兴技术:自动移动目标防御技术AMTD

自动移动目标防御技术通过启用终端配置的自适应防御来改变终端检测和响应能力。产品领导者可以实施AMTD来确保实时威胁响应&#xff0c;并减少检测和响应安全威胁所需的时间。 主要发现 通过动态修改系统配置、软件堆栈或网络特征&#xff0c;自动移动目标防御&#xff08;AMTD…

MQ,RabbitMQ,SpringAMQP的原理与实操

MQ 同步通信 异步通信 事件驱动优势&#xff1a; 服务解耦 性能提升&#xff0c;吞吐量提高 服务没有强依赖&#xff0c;不担心级联失败问题 流量消峰 ​ 小结: 大多情况对时效性要求较高&#xff0c;所有大多数时间用同步。而如果不需要对方的结果&#xff0c;且吞吐…

性能实测:分布式存储 ZBS 与集中式存储 HDS 在 Oracle 数据库场景表现如何

作者&#xff1a;深耕行业的 SmartX 金融团队 金鑫 在金融客户的基础架构环境中&#xff0c;HDS 是一种被广泛使用的存储解决方案。作为集中式存储的代表之一&#xff0c;HDS 拥有高性能、高可用性和可扩展性的企业级存储特点&#xff0c;适用于实时数据处理、虚拟化和灾难备份…

Python 潮流周刊#38:Django + Next.js 构建全栈项目

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯&#xff0c;…

开源软件全景解析:驱动技术创新与行业革新的力量

目录 什么是开源 开源的核心 开源软件的特点 为什么程序员应该拥抱开源 1.学习机会&#xff1a; 2.社区支持&#xff1a; 3.提高职业竞争力&#xff1a; 4.加速开发过程&#xff1a; 5.贡献和回馈&#xff1a; 开源软件的影响力 开源软件多元分析&#xff1a; 开源…

蓝桥杯刷题day06——平均

1、题目描述 有一个长度为n 的数组&#xff08;n 是 10 的倍数&#xff09;&#xff0c;每个数ai都是区间 [0,9] 中的整数。 小明发现数组里每种数出现的次数不太平均&#xff0c;而更改第i 个数的代价为bi&#xff0c; 他想更改若干个数的值使得这10 种数出现的次数相等&…

YOLOv8改进 | 检测头篇 | 重参数化检测头RepHead解决困难样本检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是RepHead,该检测头为我独家全网首发,该检测头由重参数化模块组成,加大对于特征学习的能力,却可以不增加GFLOPs(仅仅略微提升)从而不影响模型的推理速度和性能,保持较高的FPS能力,牺牲了少量GFLOPs的情况下确提高了模型的特征提…