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

news2024/11/25 23:19:43

         力扣(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.coloradmin.cn/o/1433583.html

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

相关文章

轻型民用无人机驾驶航空器安全操控——理论考试多旋翼部分笔记

今天已经可以在线考取轻型民用无人机驾驶航空器执照了&#xff0c;所以我也在在线观看完视频之后整理了如下的知识点&#xff0c;所有知识点全部来自UOM平台。 目录 航空器知识 &#xff08;1&#xff09;多旋翼民用无人驾驶航空器螺旋桨的作用 &#xff08;2&#x…

[office] Excel表格中的日期怎么快速标注双休日- #经验分享#职场发展#职场发展

Excel表格中的日期怎么快速标注双休日? Excel表格中的日期怎么快速标注双休日&#xff1f;excel表格中的数据想要标注出双休日&#xff0c;该怎么给双休日填充黄色背景呢&#xff1f;下面我们就来看看详细的教程&#xff0c;需要的朋友可以参考下 excel表格中的数据&#xff…

ReactNative实现的横向滑动条

OK&#xff0c;我们先看下效果图 注意使用到了两个库 1.react-native-linear-gradient 2.react-native-gesture-handler ok&#xff0c;我们看下面的代码 import {Image, TouchableWithoutFeedback, StyleSheet, View} from react-native; import LinearGradient from reac…

[linux] kolla-ansible 部署的openstack 修改mariadb默认端口号

kolla-ansible 部署前修改global.yml #freezer_database_backend: "mariadb" database_port: 9306 mariadb_port: 9306如果已经部署成功&#xff0c;直接修改配置文件里的端口号重启是没有用的&#xff0c;怀疑内部做了缓存&#xff0c;查看openstack 使用的memcach…

Abap与eCharts

一&#xff0c;简介 利用html与eCharts来绘图&#xff0c;然后用cl_gui_html_viewer将html呈现到abap屏幕中。 二&#xff0c;使用eCharts画图 在一个文件夹中准备如下文件&#xff0c;index.html和echarts.js是必须的&#xff0c;data.json(作为数据源)和jquery.js如果用到就可…

windows安装Visual Studio Code,配置C/C++运行环境(亲测可行)

一.下载 Visual Studio Code https://code.visualstudio.com/ 二.安装 选择想要安装的位置: 后面的点击下一步即可。 三.下载编译器MinGW vscode只是写代码的工具&#xff0c;使用编译器才能编译写的C/C程序&#xff0c;将它转为可执行文件。 MinGW下载链接&#xff1a;…

【节选】Go语言的100个错误使用场景|数据类型

Data types &#x1f31f; 章节概述&#xff1a; 基本类型涉及的常见错误 掌握 slice 和 map 的基本概念&#xff0c;避免使用时产生 bug 值的比较 低效的切片初始化&#xff08;#21&#xff09; 实现一个 conver 方法&#xff0c;将一个切片 Foo 转换成另一个类型的切片 Ba…

在线视频格式转换,就是这么简单!(免费)

随着数字化时代的发展&#xff0c;我们在日常生活中越来越频繁地与各种视频文件打交道。然而&#xff0c;不同设备和平台对于视频格式的支持可能存在差异&#xff0c;这就导致了我们有时需要进行视频格式的转换&#xff0c;以确保视频在各种环境中流畅播放。而幸运的是&#xf…

简单使用阿里云OSS对象存储

首先我们先去阿里云控制台开通oss对象存储&#xff08;阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台&#xff09; 这篇文件是借鉴至&#xff08;教你三分钟上手阿里云OOS上传操作_阿里云定时上传怎么使用-CSDN博客&#xff09;的&#xff0c;源码也给了&a…

Python代码混淆工具,Python源代码保密、加密、混

引言 Python作为一种高级脚本语言&#xff0c;便捷的语法和丰富的库使它成为众多开发者的首选。然而&#xff0c;有时候我们希望保护我们的Python源代码&#xff0c;避免被他人轻易获取和篡改。为了实现这一目标&#xff0c;我们可以采取代码混淆的技术手段。本文将介绍Python…

深度学习系列55:深度学习加速技术概述

总体有两个方向&#xff1a;模型优化 / 框架优化 1. 模型优化 1.1 量化 最常见的量化方法为线性量化&#xff0c;权重从float32量化为int8&#xff0c;将输入数据映射在[-128,127]的范围内。在 nvdia gpu&#xff0c;x86、arm 和 部分 AI 芯片平台上&#xff0c;均支持 8bit…

Vue中keep-alive的作用、原理及应用场景

在进行Vue开发的过程中&#xff0c;我们经常会遇到需要进行组件缓存的场景&#xff0c;这时候Vue提供的keep-alive组件就派上了用场。keep-alive组件是Vue内置的一个抽象组件&#xff0c;它可以将其包裹的组件进行缓存&#xff0c;提高组件的性能&#xff0c;同时也可以节省服务…

docker-学习-3

docker 学习第三天 docker 学习第三天1. 回顾一下1.1. 对比图1.2. docker和虚拟机的区别1.3. 在容器化部署中&#xff0c;为什么有些场景更适合选择Docker而非虚拟机&#xff1f;1.4. 有哪些场景适合选择虚拟机而不是Docker进行部署&#xff1f;1.5. 虚拟机和Docker在性能和资源…

Python 数据分析(PYDA)第三版(二)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 四、NumPy 基础知识&#xff1a;数组和向量化计算 原文&#xff1a;wesmckinney.com/book/numpy-basics 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 此开放访问网络版…

Java tomcat 使用spring-task,实现定时任务功能

前言 今天接触到一个需求&#xff0c;需要添加一个定时任务功能&#xff0c;第一反应是启动类EnableScheduling、定时任务方法使用Scheduled实现&#xff0c;导入项目后才发现&#xff0c;这个项目是ssm整合框架的tomcat项目&#xff0c;没有启动类&#xff0c; 于是改变了思路…

protoc结合go完成protocol buffers协议的序列化与反序列化

下载protoc编译器 下载 https://github.com/protocolbuffers/protobuf/releases ps: 根据平台选择需要的编译器&#xff0c;这里选择windows 解压 加入环境变量 安装go专用protoc生成器 https://blog.csdn.net/qq_36940806/article/details/135017748?spm1001.2014.3001.…

知识融合前沿技术:构建多模态、公平高效的大规模知识表示

目录 前言1 无监督对齐&#xff1a;构建智能实体关联2 多视角嵌入&#xff1a;提高数据利用效率3 嵌入表示增强&#xff1a;挑战节点相似性&#xff0c;对抗训练解决4 大规模实体对齐&#xff1a;克服模糊性和异构性结论 前言 在信息时代&#xff0c;知识融合成为推动人工智能…

AI新工具(20240204)pot-desktop - 为用户提供便捷的文字翻译和识别功能;ChatALL - 能够同时向多个AI机器人发送提示

pot-desktop - 为用户提供便捷的文字翻译和识别功能 pot-desktop pot-desktop是一款备受欢迎的跨平台划词翻译和OCR软件&#xff0c;为用户提供便捷的文字翻译和识别功能。 功能点&#xff1a; 划词翻译&#xff1a;用户只需将鼠标光标悬停在需要翻译的文字上&#xff0c;po…

Docker 可视化工具

1、Portainer 概念介绍 Portainer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 Portainer分为开源社区版&#xff08;CE版&#xff09;和商用版&#xff08;BE版/EE版&#xff09;。 Porta…

Python实现加密

目录 一&#xff1a;哈希加密 二&#xff1a;aes加密 三&#xff1a;rsa加密 Python中&#xff0c;你可以使用多种方法来实现加密。下面我们介绍下常用的加密方法。 一&#xff1a;哈希加密 下面是一个使用Python内置的hashlib库实现SHA256哈希加密的例子&#xff1a; im…