算法 - 随机 Coding 刷算法合集 [1]

news2024/9/23 19:28:34

目录

一.数组中重复的数字 [集合]

1.题目要求

2.题目思路

3.题目实现

二.二维数组中的查找 [数组]

1.题目要求

2.题目思路

3.题目实现

三.替换空格 [字符串]

1.题目要求

2.题目思路

3.题目实现

四.从尾到头打印链表 [链表]

1.题目要求

2.题目思路

3.题目实现

五.重建二叉树 [二叉树]

1.题目要求

2.题目思路

3.题目实现

六.二叉树的下一个结点 [二叉树]

1.题目要求

2.题目思路

3.题目实现

七.用两个栈实现队列 [栈、队列]

1.题目要求

2.题目思路

3.题目实现

八.斐波那契数列 [指针]

1.题目要求

2.题目思路

3.题目实现

九.旋转数组的最小数字 [二分法]

1.题目要求

2.题目思路

3.题目实现

十.矩阵中的路径 [DFS]

1.题目要求

2.题目思路

3.题目实现


一.数组中重复的数字 [集合]

1.题目要求

给定数组,判断数组中重复的数字,并任意返回重复数字,如果没有则返回 -1。

2.题目思路

如果元素不在 set 中:添加元素

如果元素在 set 中:找到重复元素,返回 -1

如果没有重复元素:返回 -1

Tips:

借助 set 实现 o(n) 的存储空间,遍历 list 需要 o(n) 的时间消耗

3.题目实现

class Solution:
    def duplicate(self , numbers: List[int]) -> int:
        # write code here
        # 特殊情况
        if (len(numbers) < 1):
            return -1
        
        # 常规情况
        numSet = set()
        for i in numbers:
            if i in numSet:
                return i
            else:
                numSet.add(i)
        
        return -1

根据上面的思路,首先判断数组为空的情况,随后只需依次添加至 set 判断即可。

二.二维数组中的查找 [数组]

1.题目要求

注意这里二维数组按行,按列均是递增的。

2.题目思路

首先遍历 row 行:

如果 target < arr[row][0] 即第一个元素,直接 pass 快进到第二行

如果 target >= arr[row][0],由于数组递增,在数组内执行二分查找

Tips:

遍历数组 row 时间复杂度 O(n),二分查找时间复杂度 O(logn),空间复杂度只需记录 left 和 right。

3.题目实现

class Solution:

    def Find(self , target: int, array: List[List[int]]) -> bool:
        # write code here
        # 空值判断
        row = len(array)
        if (row == 0):
            return False

        col = len(array[0])
        if (col == 0):
            return False

        # 区间外值直接返回
        min = array[0][0]
        max = array[row - 1][col -1]
        if (target < min or target > max):
            return False 

        # 区间内采用二分查找
        for i in range(row):
            if (target < array[i][0]):
                continue
            else:
                left = 0
                right = col - 1
                while left <= right:
                    mid = (left + right) // 2
                    if (array[i][mid] == target):
                        return True
                    elif array[i][mid] > target:
                        right = mid - 1
                    else:
                        left = mid + 1
        return False

空值判断 - 判断数组 row 或 col 为 0 的情况,如果为 0 直接退出

区间判断 - 由于按行按列递增,如果 target < min 或者 target > max,直接退出

二分查找 - 按照题目思路在规定区间进行二分查找即可

三.替换空格 [字符串]

1.题目要求

 注意这里可能有多个空格

2.题目思路

这题主要考察 python 常规 API 熟悉程度,调用 string.replace 即可实现对应功能。只需注意异常值即可。

3.题目实现

class Solution:
    def replaceSpace(self , s: str) -> str:
        # write code here
        if (s == ""):
            return ""

        s = s.replace(" ", "%20")

        return s

四.从尾到头打印链表 [链表]

1.题目要求

2.题目思路

非常常规的链表题目,只需构建数组依次保存链表结果,随后反转输出列表即可。

3.题目实现

class Solution:
    def printListFromTailToHead(self , listNode: ListNode) -> List[int]:
        # write code here
        res = []
        while listNode:
            res.append(listNode.val)
            listNode = listNode.next
        # 数组翻转
        return res[::-1]

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

五.重建二叉树 [二叉树]

1.题目要求

2.题目思路

首先需要清晰二叉树几种遍历的区别:

前序遍历 - 根左右

中序遍历 - 左根右

后续遍历 - 左右根

在结合当前题目,本题给出前序与中序遍历,且元素唯一[很关键]:

A.前序遍历的第一个节点一定是根节点,如图中前序对应首位 1

B.在中序遍历中寻找与根节点相同的点,即为中序遍历中的根节点

C.根据中序遍历的左根右可知,当前节点左边为左子树 472,右边为右子树 5386

D.此时中序遍历得到的两棵子树依然是中序遍历,且前序遍历中对应长度的两个树为其对应的前序遍历 472 为中序遍历,其前序遍历为 247,同理中序遍历 5386,前序遍历 3568

E.所以整体的大树问题转换为两个分开的小树的问题,采用递归的形式解决,我们可以继续分别对 247,472 应用 ABCD 的逻辑,此时通过 247 可知 2 为根节点,左小子树为 47;通过 472 可知根节点 2 无右子树;此时小小树为 47,根节点为4,其没有左节点,所以7为其右节点,5368 同理。

3.题目实现

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param pre int整型一维数组 
# @param vin int整型一维数组 
# @return TreeNode类
#
class Solution:
    def reConstructBinaryTree(self , pre: List[int], vin: List[int]) -> TreeNode:
        # write code here
        m = len(pre) # 中序遍历长度 根左右
        n = len(vin) # 前序遍历长度 左根右

        # 异常情况
        if m * n == 0:
            return None

        # 构建根节点
        # 这里前序遍历是根左右,所以 pre 的第一个元素是根节点
        root = TreeNode(pre[0])
        for i in range(m):
            # 找到中序遍历中与根节点相同的点,将二叉树区分
            if pre[0] == vin[i]:
                # 左子树的前序遍历
                leftPre = pre[1:i+1]
                # 左子树的中序遍历
                leftVin = vin[:i]
                root.left = self.reConstructBinaryTree(leftPre, leftVin)

                # 右子树的前序遍历
                rightPre = pre[i+1:]
                # 右子树的中序遍历
                rightVin = vin[i+1:]
                # 构建右子树
                root.right = self.reConstructBinaryTree(rightPre, rightVin)
                # 找到与根节点一样的元素就退出了,因为元素唯一
                break

        return root

六.二叉树的下一个结点 [二叉树]

1.题目要求

这个题其实就是给定层序遍历的情况下,并给定一个节点值,判断中序遍历下该节点值的下一个 Node,与传统 Tree 不同的是,这里还给了一个 next 指针指向 root 父节点。

2.题目思路

常规思路:

最简单的方法就是先找到 root 推导出完整中序遍历,随后依次遍历中序遍历寻找对应值的下一个节点即可。

图形思路:

如果当前节点有右孩子,就找其右子树最左边的孩子节点,给定 2 求后续节点

如果当前节点没有右孩子,就向上找其父节点,如果当前节点是其父节点的左孩子,则返回父节点,如果当前节点不是父节点,则一直向上查找直到满足当前节点是父节点的左孩子,并返回,否则返回 None,给定 2 求后续节点

3.题目实现

A.常规思路

# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None


class Solution:
    nodes = []

    def midOrder(self, root):
        if root == None:
            return
        self.midOrder(root.left)
        self.nodes.append(root)
        self.midOrder(root.right)

    def GetNext(self, pNode):
        # write code here
        # 查找根节点
        root = pNode
        while root.next:
            root = root.next

        # 中序遍历打造 Nodes
        self.midOrder(root)

        # 匹配节点
        for i in range(len(self.nodes) - 1):
            cur = self.nodes[i]
            if pNode == cur:
                return self.nodes[i + 1]
        return None

B.图形思路

# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None


class Solution:
    def GetNext(self, pNode):
        # write code here
        if not pNode:
            return pNode

        # 当前节点有右孩子,那么就去找当前节点右子树最左边的那个孩子节点
        if pNode.right:
            pNode = pNode.right
            while pNode.left:
                pNode = pNode.left
            return pNode

        # 当前节点没有右孩子,那么向上找父节点
        while pNode.next:
            root = pNode.next
            if root.left == pNode:
                return root
            pNode = pNode.next
        return None

七.用两个栈实现队列 [栈、队列]

1.题目要求

2.题目思路

本题主要考察队列和栈的特性:

队列 - 元素不可以进行下标访问,先进先出

栈 - 元素不可以进行下标访问,先进后出

用两个栈 [先进后出] 模拟队列 [先进先出] 主要方法就是通过两个栈互相转换,第一个栈先 append 再 pop 给第二个栈,第二个栈再 append,结束后 pop,实现顺序的反转。

3.题目实现

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def push(self, node):
        self.stack1.append(node)

    def pop(self):
        # 将第一个栈中内容弹出放入第二个栈中
        while self.stack1:
            self.stack2.append(self.stack1.pop())
        # 第二个栈栈顶就是最先进来的元素,即队首
        res = self.stack2.pop()
        # 再将第二个栈的元素放回第一个栈
        while self.stack2:
            self.stack1.append(self.stack2.pop())
        return res

八.斐波那契数列 [指针]

1.题目要求

2.题目思路

利用斐波那契数列的性质,f(n) = f(n-1) + f(n-2),所以我们可以使用三个指针,重复赋值,直到预定结果 n:

n 小于等于 2 - 直接返回 0 或 1

n 大于 2 - 令 re = 0、left = 0、right = 1,依次遍历更新令 re = left + right、left = right、right = re 即可

3.题目实现

#
# @param n int整型
# @return int整型
#
class Solution:
    def Fibonacci(self, n: int) -> int:
        # 从0开始,第0项是0,第一项是1
        if n <= 1:
            return n
        
        # 初始化原始值
        res = 0
        left = 0
        right = 1
        # 开始循环赋值
        for i in range(2, n + 1):
            res = left + right
            left = right
            right = res
        return res

九.旋转数组的最小数字 [二分法]

1.题目要求

注意数组为非降序,但是可以重复

2.题目思路

虽然数组调换了一次顺序,但是两部分都是非降序的,所以首先根据 mid 和 right 寻找哪一边的数字小,将区间不断缩小寻找最小值即可:

 下面是最小值在两边的两种初始情况:

3.题目实现

# 
# @param rotateArray int整型一维数组 
# @return int整型
#
class Solution:
    def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
        
        # 寻找目标区间
        left = 0
        right = len(rotateArray) - 1

        while left < right:
            mid = (left + right) // 2
            # 最小值在mid右边
            if rotateArray[mid] > rotateArray[right]:
                left = mid + 1
            # 相等,稍作调整继续判断
            elif rotateArray[mid] == rotateArray[right]:
                right -= 1
            # 最小值在mid左边
            else:
                right = mid
        
        return rotateArray[left]

十.矩阵中的路径 [DFS]

1.题目要求

2.题目思路

通过 DFS 每次向四个可能的方向进行探索,同时原题要求不可重复使用,所以需要用到一个同样维度的矩阵记录每个点的使用状态。

3.题目实现

#
# @param matrix char字符型二维数组 
# @param word string字符串 
# @return bool布尔型
#
class Solution:
    def dfs(self, matrix: List[List[str]], n: int, m: int, i: int, j: int, word: str, k: int, flag: List[List[bool]]) -> bool:
        if i < 0 or i >= n or j < 0 or j >= m or (matrix[i][j] != word[k] or flag[i][j]):
            # i,j 下标越界、字符串不匹配、字符已使用
            return False

        # 找到最后一个字符
        if k == len(word) - 1:
            return True

        # 没达到长度继续 DFS
        flag[i][j] = True

        # 该节点任意方向
        if (self.dfs(matrix, n, m, i-1, j, word, k+1, flag) or
        self.dfs(matrix, n, m, i+1, j, word, k+1, flag) or
        self.dfs(matrix, n, m, i, j-1, word, k+1, flag) or
        self.dfs(matrix, n, m, i, j+1, word, k+1, flag)):
            return True
        
        # 该点4个方向都没找到
        flag[i][j] = False

        return False


    def hasPath(self , matrix: List[List[str]], word: str) -> bool:
        # 空矩阵直接返回
        if (len(matrix) == 0):
            return False
        
        n = len(matrix)
        m = len(matrix[0])

        flag = [[False for i in range(m)] for j in range(n)]

        for i in range(n):
            for j in range(m):
                if (self.dfs(matrix, n, m, i, j, word, 0, flag)):
                    return True
        return False      
        

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

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

相关文章

电脑技巧:分享浏览器5个小技巧,太实用了

大家在日常办公当中&#xff0c;浏览器可以说占用非常大的比重&#xff0c;比如搜个素材、图片、文档等等&#xff0c;今天就来给大家分享5个浏览器使用的小技巧&#xff0c;希望对大家能有所帮助&#xff01; 1、浏览器常用快捷键梳理 其实Web浏览器快捷键很多&#xff0c;但…

MySQL_第14章_视图

第14章_视图 1. 常见的数据库对象 对象描述表(TABLE) 表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录 数据字典 就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c; 程序…

Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字

线程安全问题是多线程编程中最典型的一类问题之一。如果多线程环境下代码运行的结果是符合我们预期的&#xff0c;即该结果正是在单线程环境中应该出现的结果&#xff0c;则说这个程序是线程安全的。 通俗来说&#xff0c;线程不安全指的就是某一代码在多线程环境下执行会出现b…

【边缘计算】登临(Goldwasser-UL64)BW-BR2边缘设备配置指南

目录 开箱配置激活SDK环境测试cuda兼容性 开箱配置 更改盒子root用户密码&#xff1a; sudo passwd root(密码同为root) 切换到root用户身份&#xff1a; su root查看ssh的状态&#xff0c;没有返回说明没有启动 sudo ps -e|grep ssh此时说明ssh服务已启动。 更改ssh配置文…

Android MediaCodec dump MP4实践小结

1.应用背景 在一些集成了算法SDK的Android APP中&#xff0c;这些APP是取出摄像头实时帧&#xff0c;然后调用视觉算法SDK并产生检测结果。而当测试人员发现某一场景下算法效果欠佳时&#xff0c;需要从摄像头实时原始数据帧dump一段视频&#xff08;mp4格式&#xff09;&#…

【TB作品】MSP430单片机 Proteus仿真 DS18B20温度 LCD1602显示器 温度读取与显示

效果图如下&#xff1a; 首先,让我们先来说说DS18B20集成电路。 • DS18B20是一款采用OneWire通讯协议的集成电路,因此只需要一条线就可以与微控制器通讯。它不需要额外的电源,但是也有外部电源输入端口。 • OneWire设备具有64位的ROM代码。如我们之前所说,这64位的前8位是家…

HDCTF

Welcome To HDCTF 2023 看源码找到game.js 找到这一串 放到控制台运行即可 SearchMaster 题目让post提交一个data 随便传一个在页面执行了 当传入{时他会报错&#xff0c;看报错信息发现 Smarty&#xff0c;猜测Smarty的ssti&#xff0c;数据发送到前端 用{if}标签即可 {…

CHAPTER 5: 《DESIGN CONSISTENT HASHING》 第5章 《设计一致的哈希》

CHAPTER 5: DESIGN CONSISTENT HASHING 为了实现水平扩展&#xff0c;有效且均匀地分发请求/数据是很重要的在服务器上。一致散列是实现这一目标的常用技术。但首先&#xff0c;让我们深入了解一下这个问题。 重组问题 如果您有n个缓存服务器&#xff0c;那么平衡负载的常用…

PCB射频电路四大基础特性及设计技巧

由于射频(RF)电路为分布参数电路&#xff0c;在电路的实际工作中容易产生趋肤效应和耦合效应&#xff0c;所以在实际的PCB设计中&#xff0c;会发现电路中的干扰辐射难以控制。 如&#xff1a;数字电路和模拟电路之间相互干扰、供电电源的噪声干扰、地线不合理带来的干扰等问题…

catkin_make_workspace

ERROR1 : CMake Error at /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake:113 (message): Project ‘cv_bridge’ specifies ‘/usr/include/opencv’ as an include dir, which is not found. It does neither exist as an absolute directory nor in ‘${{pr…

Vue-列表过滤

列表过滤 对已知的列表进行数据过滤(根据输入框里面的内容进行数据过滤) 编写案例 通过案例来演示说明 效果就是这样的 输入框是模糊查询 想要实现功能&#xff0c;其实就两大步&#xff0c;1获取输入框内容 2根据输入内容进行数据过滤 绑定收集数据 我们可以使用v-model去…

6.3 收敛性与稳定性

6.3.1 收敛性 数值计算方法的收敛性是指&#xff0c;当取步长趋近于零时&#xff0c;数值解趋近于精确解的速度。一般来说&#xff0c;数值计算方法的收敛性是判断其优劣的重要指标之一。 数值计算方法的收敛性可以通过数学分析来研究&#xff0c;一般需要对数值解和精确解之…

08-Node.js—nvm

目录 1、介绍2、使用2.1 下载安装2.2 常用命令2.2.1 nvm list available2.2.2 nvm list2.2.3 nvm install 18.12.12.2.4 nvm install latest2.2.5 nvm uninstall 18.12.12.2.6 nvm use 18.12.1 参考 1、介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工…

系统集成项目管理工程师——考试重点(三)项目管理一般知识

1.项目定义&#xff1a; 为达到特定的目的&#xff0c;使用一定资源&#xff0c;在确定的期间内&#xff0c;为特定发起人提供独特的产品、服务或成果而进行的一系列相互关联的活动的集合。 2.项目目标&#xff1a; 成果性目标&#xff1a;项目产品本身 约束性目标&…

频繁GC引起卡顿问题排查与解决

一 问题描述 今天测试组更新测试环境后发现系统卡顿&#xff0c;无法办理任何业务&#xff0c;重启系统后问题仍然存在。已经到项目后期&#xff0c;迭代测试时间十分紧张。此问题直接影响到项目进度 二 排查过程 1.执行命令top Linux 下常用top命令显示系统中各个进程的资…

PID原理

PID控制器&#xff08;比例-积分-微分控制器&#xff09;&#xff0c;由比例单元&#xff08;P&#xff09;、积分单元&#xff08;I&#xff09;和微分单元&#xff08;D&#xff09;组成。 可以通过调整这三个单元的增益Kp&#xff0c;Ki和Kd来调定其特性&#xff0c;PID控制…

PowerDesigner 15 安装、汉化、逆向生成ER图、物理模型转逻辑模型、生成sql及简单使用

文章目录 前言PowerDesigner 15 安装、汉化、逆向生成ER图、物理模型转逻辑模型、生成sql及简单使用1. 安装2. 汉化3. 使用4. 逆向生成ER图4.1. 创建新模型4.2. 根据sql逆向生成er图 5. 物理模型新建表6. 物理模型转逻辑模型7. 生成sql语句 前言 如果您觉得有用的话&#xff0c…

Modelsim10.7仿真报错

把之前老版本的modelsim换掉了&#xff0c;新的装好仿真发现有点小毛病&#xff0c;记录以下 使用modelsim10.7仿真时出现错误&#xff0c;编译通过但报以下错误 ** Note: (vsim-3812) Design is being optimized…** INTERNAL ERROR: vopt returned success but vsim could …

arthas的简单使用

目录 arthas是什么为什么要使用arthasarthas能做什么安装arthas前提准备arthas主要命令trace命令watch命令monitor命令jad命令dashboard命令Thread命令sc命令mc命令redefine命令 实战演练1.定位到需要修改的类2.将定位到的.class文件反编译成.java文件3.修改.java文件4.将修改后…

不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 转载自内网穿透工具的文章&#xff1a;Python一行代码实现文件共享【内网穿透公网访问…