Week6-LeetCode

1600.王位继承顺序 (中等)

关键思路:
多叉树的前序遍历。

class ThroneInheritance(object):def __init__(self, kingName):""":type kingName: str"""self.king = kingNameself.dead = set() # 记录死亡人员self.edges = defaultdict(list)  # defaultdict(list) 中,如果访问的键不存在,则会自动创建一个空列表作为默认值def birth(self, parentName, childName):""":type parentName: str:type childName: str:rtype: None"""self.edges[parentName].append(childName)def death(self, name):""":type name: str:rtype: None"""self.dead.add(name)def getInheritanceOrder(self):""":rtype: List[str]"""ans = list()def preorder(name):if name not in self.dead:ans.append(name)if name in self.edges:for childName in self.edges[name]:preorder(childName)preorder(self.king)return ans# Your ThroneInheritance object will be instantiated and called as such:
# obj = ThroneInheritance(kingName)
# obj.birth(parentName,childName)
# obj.death(name)
# param_3 = obj.getInheritanceOrder()

11. 盛最多水的容器 (中等)

关键思路:
面积取决于两个支柱之间更矮的那个,因此,哪一个更矮就移动哪一个。

class Solution(object):def maxArea(self, height):""":type height: List[int]:rtype: int"""n = len(height)MaxArea = 0i = 0j = n - 1while i < j:h = min(height[i], height[j])area = h * (j - i)MaxArea = max(area, MaxArea)if height[i] < height[j]:i += 1else:j -= 1return MaxArea         

12. 整数转罗马数字 (中等)

关键思路:

  1. 罗马数字的规则是:对于罗马数字从左到右的每一位,选择尽可能大的符号值
  2. 把所有可能出现的数值情况编成一个字典(共13种)
class Solution(object):VALUE_SYMBOLS = [(1000, "M"),(900, "CM"),(500, "D"),(400, "CD"),(100, "C"),(90, "XC"),(50, "L"),(40, "XL"),(10, "X"),(9, "IX"),(5, "V"),(4, "IV"),(1, "I"),]def intToRoman(self, num):""":type num: int:rtype: str"""roman = list()for value, symbol in Solution.VALUE_SYMBOLS:while num >= value:num -= valueroman.append(symbol)if num == 0:breakreturn "".join(roman)

13. 罗马数字转整数 (简单)

关键思路:
默认为加,如果当前值小于下一个值,那就减。

class Solution(object):SYMBOL_VALUES = {'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,}def romanToInt(self, s):""":type s: str:rtype: int"""ans = 0n = len(s)for i, ch in enumerate(s):value = Solution.SYMBOL_VALUES[ch]if i < n - 1 and value < Solution.SYMBOL_VALUES[s[i + 1]]:ans -= valueelse:ans += valuereturn ans

14. 最长公共前缀 (简单)

关键思路:
逐列对比

class Solution(object):def longestCommonPrefix(self, strs):""":type strs: List[str]:rtype: str"""if not strs:return ""length, count = len(strs[0]), len(strs)for i in range(length):c = strs[0][i]if any(i == len(strs[j]) or strs[j][i] != c for j in range(1, count)):return strs[0][:i]return strs[0]   

2009. 使数组连续的最少操作数 (困难)

关键思路:
把题目转换为:最多能保留多少个数字。
使用滑动窗口, 窗口的大小为nums.length - 1, 让nums[i]依次作为滑动窗口的端点,看最多能框多少个不同的值,对于不同的值,可以想到集合set()

class Solution(object):def minOperations(self, nums):""":type nums: List[int]:rtype: int"""n = len(nums)a = sorted(set(nums)) # 去重排序ans = left = 0for i, x in enumerate(a):  # x 是修改后的连续数字的最大值  滑动窗口的区间是[x - n + 1, x]while a[left] < x - n + 1:  # 对不在区间内的计数left += 1ans = max(ans, i - left + 1) # 可以框进的整数数量return n - ans

15.三数之和 (中等)

关键思路:
将原列表按从小到大排序后进行枚举,分为三个指针来指向i, j, k,进行多次遍历求解。
每次遍历中, 如果每个指针指向的值和上一个指向的值相等,就遍历下一个,第一个指针从左往右遍历,第三个指针从右往左遍历,第二个指针在第一个指针的右边向右遍历,如果遇上了从右向左的指针,就停止遍历。
在下一次的遍历中,第三个指针重新回到最右,再次移动。

class Solution(object):def threeSum(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""n = len(nums)nums.sort()ans = list()for i in range(n):if i > 0 and nums[i] == nums[i - 1]:continuek = n - 1target = -nums[i]for j in range(i + 1, n):if j > i + 1 and nums[j] == nums[j - 1]:continuewhile j < k  and nums[j] + nums[k] > target:k -= 1if j == k:breakif nums[j] + nums[k] == target:ans.append([nums[i], nums[j], nums[k]])return ans

16. 最接近的三数之和 (中等)

关键思路:
固定一个指针,移动两个指针,大致思路与上一题相似。

class Solution(object):def threeSumClosest(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""nums = sorted(nums)n = len(nums)result = nums[0] + nums[1] + nums[2]mindiff = abs(target - result)for i in range(n -2):left = i + 1right = n - 1while left < right:ans = nums[i] + nums[left] + nums[right]if abs(target - ans) < mindiff:result = ansmindiff = abs(target - ans)if ans > target:right -= 1elif ans == target:return resultelse:left += 1return result

17. 电话号码的字符组合 (中等)

关键思路:
看到组合就要想到回溯。

class Solution(object):def letterCombinations(self, digits):""":type digits: str:rtype: List[str]"""if not digits:return []phone = {'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],'6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}def backtrack(conbination, nextdigit):if len(nextdigit) == 0:res.append(conbination)else:for letter in phone[nextdigit[0]]:backtrack(conbination + letter, nextdigit[1:])res = []backtrack('', digits)return res

18. 四数之和 (中等)

关键思路:
类似15、16题。

class Solution(object):def fourSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[List[int]]"""n = len(nums)nums.sort()ans = []if n < 4 :return []for i in range(n - 3):if i > 0 and nums[i] == nums[i - 1]:continueif nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:breakif nums[i] + nums[n - 1] + nums[n - 2] + nums[n - 3] < target:continuefor j in range(i + 1, n - 2):if j > i + 1 and nums[j] == nums[j - 1]:continueif nums[i] + nums[j + 1] + nums[j + 2] + nums[j] > target:breakif nums[i] + nums[j] + nums[n - 1] + nums[n - 2] < target:continueleft, right = j + 1, n - 1while left < right:total = nums[i] + nums[j] + nums[left] + nums[right]if total == target:ans.append([nums[i], nums[j], nums[left], nums[right]])while left < right and nums[left] == nums[left + 1]:left += 1left += 1while left <right and nums[right] == nums[right - 1]:right -= 1right -= 1elif total < target:left += 1else:right -= 1return ans

19. 删除链表的倒数第 N 个结点 (中等)

关键思路:
使用两个指针一起移动,其中一个先走n + 1步,遍历到最后, 另一个直接到达倒数第n个结点的前面一个。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):def removeNthFromEnd(self, head, n):""":type head: ListNode:type n: int:rtype: ListNode"""dummy = ListNode(0)dummy.next = headp = dummyq = dummy# 将 p 指针向前移动 n+1 步for i in range(n + 1):if p is None:return head  # 链表长度不足 n+1,无法删除节点p = p.next# 同时移动 p 和 q 指针,直到 p 指向链表末尾while p is not None:p = p.nextq = q.next# 删除倒数第 n 个节点q.next = q.next.next   return dummy.next           

20. 有效的括号(简单)

关键思路:
使用栈

class Solution(object):def isValid(self, s):""":type s: str:rtype: bool"""# 括号匹配思路:使用栈stack = []mapping = {')':'(', ']' : '[', '}':'{'}for char in s:if char in mapping:el = stack.pop() if stack else ''if mapping[char] != el:return Falseelse:stack.append(char)return not stack

1702. 修改后的最大二进制字符串 (中等)

关键思路:
规则1的意思是前面的0可以变成1,推广则是我们可以将一连串的0变成只有最后一位是0、其他全是1
规则2的意思是可以把后面的0推到前面来,推广则是我们可以将任意一个0往前推、推到所有的1前面去。
因此:
观察到结果的规律在于0的个数,如果没有0, 直接返回。
如果有0,变化后的数字最多只会有10,结果中 0 的位置取决于字符串第一个 0 的位置,之后每多一个 0 便可以向后移动一位。

class Solution(object):def maximumBinaryString(self, binary):""":type binary: str:rtype: str"""n = len(binary)i = binary.find("0")if i < 0:return binaryzeros = binary.count('0')s = ['1'] * ns[i + zeros - 1] = '0'return ''.join(s)

1766. 互质数 (困难)

关键思路:
使用深度优先遍历,根节点到任意节点的搜索路径就是该节点的祖先节点的集合,故搜索路径上最近的与其互质的就是答案。

class Solution:def getCoprimes(self, nums: List[int], edges: List[List[int]]) -> List[int]:n = len(nums)# 初始化gcds = [[] for _ in range(51)]tmp = [[] for _ in range(51)]ans = [-1] * ndep = [-1] * n g = [[] for _ in range(n)]def dfs(x: int, depth: int):dep[x] = depthfor val in gcds[nums[x]]:if not tmp[val]:continuelas = tmp[val][-1]if ans[x] == -1 or dep[las] > dep[ans[x]]:ans[x] = lastmp[nums[x]].append(x)for val in g[x]:if dep[val] == -1: # 被访问过的点dep不为-1dfs(val, depth + 1)tmp[nums[x]].pop()for i in range(1, 51):for j in range(1, 51):if math.gcd(i, j) == 1:gcds[i].append(j)for x, y in edges:g[x].append(y)g[y].append(x)dfs(0, 1)return ans

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

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

相关文章

Hadoop安装部署-NameNode高可用版

Hadoop分布式文件系统支持NameNode的高可用性&#xff0c;本文主要描述NameNode多节点高可用性的安装部署。 如上所示&#xff0c;Hadoop分布式文件系统部署了NameNode的Master主节点以及NameNode的Slave副节点&#xff0c;当Master主节点发生故障变得不可用时&#xff0c;ZooK…

llama-factory SFT系列教程 (一),大模型 API 部署与使用

文章目录 背景简介难点 前置条件1. 大模型 api 部署下一步阅读 背景 本来今天没有计划学 llama-factory&#xff0c;逐步跟着github的文档走&#xff0c;发现这框架确实挺方便&#xff0c;逐渐掌握了一些。 最近想使用 SFT 微调大模型&#xff0c;llama-factory 是使用非常广泛…

python之文件操作与管理

1、文件操作 通过open&#xff08;&#xff09;操作&#xff0c;来创建文件对象&#xff0c;下面是open&#xff08;&#xff09;函数语法如下&#xff1a; open&#xff08;file,mode r,buffering -1 , encoding None ,errors None , newline None,closefd True,opener …

【综合分析类】校园霸凌

题目&#xff1a;近日&#xff0c;某地发生了一名初中生被3名初中生霸凌致S的事件&#xff0c;在社会上引起了广泛争议。有人呼吁&#xff0c;要完善未成年人保护法&#xff0c;进一步惩戒有关未成年的犯罪人员。对此你怎么看。 逐字稿&#xff1a;各位考官&#xff0c;考生思…

14. TypeScript类型保护(类型缩小、类型守卫)

类型保护是一种TypeScript技术&#xff0c;用于获取变量类型信息&#xff0c;通常使用在条件块语句中。 类型守卫是返回布尔值的常规函数&#xff0c;接受一个类型并告诉TypeScript是否可以缩小到更具体的类型。 TypeScript类型保护的方式 类型断言 类型断言是一种告诉编译器…

汇编基础-----常见命令基本使用

汇编基础-----常见命令基本使用 MOV&#xff1a;将数据从一个位置复制到另一个位置。 MOV destination, source例如&#xff1a; MOV RAX, RBX ; 将RBX寄存器中的值复制到RAX寄存器中ADD/SUB&#xff1a;将两个操作数相加或相减。 ADD destination, source SUB destinatio…

Python(3):条件语句+循环语句+逻辑运算符+符号优先级

文章目录 一、if语句1.if语句2.if 和 elif区别3.三元表达式 二、循环语句1.range函数和循环结束关键字2.while循环3.for循环 三、逻辑运算符1.and语句2.or语句3.not语句4.逻辑运算法的优先级 四、python运算符优先级和结合性一览表 一、if语句 1.if语句 1.if单分支语句 格式…

Python项目1 外星人入侵_外星人

在本章中&#xff0c;我们将在游戏《外星人入侵》中添加外星人。首先&#xff0c;我们在屏幕上边缘附近添加一个外星人&#xff0c;然后生成一群外星人。我们让这群外星人向两边和下面移 动&#xff0c;并删除被子弹击中的外星人。最后&#xff0c;我们将显示玩家拥有的飞船数量…

Python-configparser更新write保留注释

背景 python语言用来解析配置文件的模块是ConfigParser&#xff0c;python3中是configparser模块&#xff0c;在使用中经常用到write方法将配置项重新写入文件&#xff1a; config.ini文件&#xff1a; # 数据库配置 [database] # 主机 # IP host localhost # 端口 port 3…

从路由器syslog日志监控路由器流量

路由器是关键的网络基础设施组件&#xff0c;需要随时监控&#xff0c;定期监控路由器可以帮助管理员确保路由器通信正常。日常监控还可以清楚地显出通过网络的流量&#xff0c;通过分析路由器流量&#xff0c;安全管理员可及早识别可能发生的网络事件&#xff0c;从而避免停机…

关于STL容器线程安全性的问题

关于STL容器线程安全性的问题 STL容器&#xff08;如vector&#xff09;本身并不是线程安全的&#xff0c;因此在使用它们进行多线程编程时需要格外小心。即便写入操作&#xff08;由生产者执行&#xff09;是由单线程完成的&#xff0c;但在并发读取时&#xff0c;由于可能发…

程序员如何搞副业——中学生视角看职业拓展的深入探索

在数字化浪潮席卷全球的今天,程序员这一职业因其独特的魅力和广阔的发展前景而备受瞩目。作为一名中学生,虽然尚未步入职业领域,但提前了解程序员的副业之路,不仅可以帮助我们拓宽视野,还能为未来的职业规划提供有益的参考。 首先,个人项目开发是程序员搞副业的一个重要…

计算机中,逻辑端口

计算机中,端口是什么 在计算机领域中,端口(Port)是一个逻辑概念,用于标识计算机与外部设备或另一台计算机通信时的出入口。它是计算机与外部通信的途径,分为物理端口和逻辑端口两种。 物理端口:物理端口也被称为接口,是计算机主板上或其他设备上的硬件接口,如USB接口…

算法训练营第二十三天(二叉树完结)

算法训练营第二十三天&#xff08;二叉树完结&#xff09; 669. 修剪二叉搜索树 力扣题目链接(opens new window) 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改…

SQLite数据库在Linux系统上的使用

SQLite是一个轻量级的数据库解决方案&#xff0c;它是一个嵌入式的数据库管理系统。SQLite的特点是无需独立的服务器进程&#xff0c;可以直接嵌入到使用它的应用程序中。由于其配置简单、支持跨平台、服务器零管理&#xff0c;以及不需要复杂的设置和操作&#xff0c;SQLite非…

【算法】排硬币 - 二分法/牛顿迭代

题目 假设有n枚硬币&#xff0c;要摆一个阶梯形&#xff0c;第一行1个&#xff0c;第二行2个&#xff0c;以此类推&#xff0c;看n枚硬币能摆多少行&#xff0c;返回行数。未摆满行的不算。 原理 二分法 先假设放 x 行需要 m 个硬币&#xff0c;用 m 与 n 对比&#xff0c;…

OpenGL着色器实现纹理合并显示

OpenGL着色器实现纹理合并显示 本文介绍了opengl下实现纹理的装载&#xff0c;同时借助顶点着色器和片源着色器实现两个不同外部纹理的合并显示。 目录 1 opengl下纹理的装载2 纹理合并效果显示3 完整的代码 1 opengl下纹理的装载 // 初始化GLFWif (!glfwInit()) {std::cerr …

从建表语句带你学习doris_数据类型

1、前言概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE = [olap|mysql|broker|hive]] [key_desc] [COMMENT "table co…

共享低碳未来!科士达新一代工商业储能产品引爆ESIE 2024

4月11日&#xff0c;第十二届储能国际峰会暨展览会&#xff08;ESIE 2024&#xff09;在北京首钢会展中心盛大开幕&#xff0c;科士达以“数智光储&#xff0c;共享低碳未来”为主题&#xff0c;携多款工商业储能产品及解决方案惊艳亮相本次盛会。 展会首日&#xff0c;科士达展…

C/C++基础----运算符

算数运算符 运算符 描述 例子 两个数字相加 两个变量a b得到两个变量之和 - 两个数字相减 - * 两个数字相乘 - / 两个数字相除 - % 两个数字相除后取余数 8 % 3 2 -- 一个数字递减 变量a&#xff1a;a-- 、--a 一个数字递增 变量a: a 、 a 其中递…