热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[LeetcodeWeeklyContest]180

链接:LeetCode[Leetcode]5356.矩阵中的幸运数给一个\(m*n\)的矩阵,矩阵中的数字各不相同。请按任意顺序返回矩阵中的所有幸运数。幸运数是指矩阵中满足同时下列

链接:LeetCode

[Leetcode]5356. 矩阵中的幸运数

给一个\(m * n\)的矩阵,矩阵中的数字 各不相同 。请按任意顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:

  • 在同一行的所有元素中最小
  • 在同一列的所有元素中最大
     
    示例 1:
    输入:matrix = [[3,7,8],[9,11,13],[15,16,17]]
    输出:[15]
    解释:15 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。

这题暴力解即可,循环判断矩阵行(列)的最小(大)值。

class Solution:
    def luckyNumbers (self, matrix: List[List[int]]) -> List[int]:
        n,m = len(matrix),len(matrix[0])
        res1 = set()
        res2 = set()
        for i in range(n):
            min_num = min(matrix[i])
            res1.add(min_num)
        for j in range(m):
            nums = [x[j] for x in matrix]
            max_num = max(nums)
            res2.add(max_num)
        res = list(res1 & res2)
        return res

[Leetcode]1381. 设计一个支持增量操作的栈

请你设计一个支持下述操作的栈。

  • 实现自定义栈类 CustomStack :
  • CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。
  • void push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。
  • int pop():返回栈顶的值,或栈为空时返回 -1 。
  • void inc(int k, int val):栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ,则栈中的所有元素都增加 val 。

示例:
输入:
\(["CustomStack","push","push","pop","push","push","push","increment","increment","pop","pop","pop","pop"]\)
\([[3],[1],[2],[],[2],[3],[4],[5,100],[2,100],[],[],[],[]]\)
输出:
\([null,null,null,2,null,null,null,null,null,103,202,201,-1]\)
解释:
CustomStack customStack = new CustomStack(3); // 栈是空的 []
customStack.push(1); // 栈变为 [1]
customStack.push(2); // 栈变为 [1, 2]
customStack.pop(); // 返回 2 --> 返回栈顶值 2,栈变为 [1]
customStack.push(2); // 栈变为 [1, 2]
customStack.push(3); // 栈变为 [1, 2, 3]
customStack.push(4); // 栈仍然是 [1, 2, 3],不能添加其他元素使栈大小变为 4
customStack.increment(5, 100); // 栈变为 [101, 102, 103]
customStack.increment(2, 100); // 栈变为 [201, 202, 103]
customStack.pop(); // 返回 103 --> 返回栈顶值 103,栈变为 [201, 202]
customStack.pop(); // 返回 202 --> 返回栈顶值 202,栈变为 [201]
customStack.pop(); // 返回 201 --> 返回栈顶值 201,栈变为 []
customStack.pop(); // 返回 -1 --> 栈为空,返回 -1

搞清规则后,朴素的思想是建立一个stack,每次increment的时候遍历栈进行累加即可。一种更好的方法,其实是不用对前k个数都进行累加的,只需要对k-1个数进行记录,在pop的时候进行累加的同时,将累加值也记录到前一个元素中。这样能大大减少累加的时间复杂度。
最后,要注意k可能大于stack的大小,需要对k进行判断。

class CustomStack:
    def __init__(self, maxSize: int):
        self.stack = []
        self.maxSize = maxSize
        self.size = 0


    def push(self, x: int) -> None:
        if self.size ==self.maxSize:
            return
        else:
            self.stack.append([x,0])
            self.size += 1


    def pop(self) -> int:
        if not self.size:return -1
        val,inc = self.stack.pop()
        self.size -= 1
        if self.size:
            self.stack[-1][1] += inc
        return val+inc


    def increment(self, k: int, val: int) -> None:
        k = min(k,self.size)
        # 防止k为0
        if k:
            self.stack[k-1][1] += val



# Your CustomStack object will be instantiated and called as such:
# obj = CustomStack(maxSize)
# obj.push(x)
# param_2 = obj.pop()
# obj.increment(k,val)```

[Leetcode]1382. 将二叉搜索树变平衡

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。如果有多种构造方法,请你返回任意一种。

通过中序遍历获取数组,然后重建平衡二叉搜索树即可。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def balanceBST(self, root: TreeNode) -> TreeNode:
        nums = []
        self.dfs(root,nums)
        return self.reBuildBST(nums)

    def dfs(self,root,nums):
        if not root:
            return
        self.dfs(root.left,nums)
        nums.append(root.val)
        self.dfs(root.right,nums)

    def reBuildBST(self,nums):
        if not nums:return
        mid = len(nums)//2
        root = TreeNode(nums[mid])
        root.left,root.right = self.reBuildBST(nums[:mid]),self.reBuildBST(nums[mid+1:])
        return root

[Leetcode]1383. 最大的团队表现值

公司有编号为 1 到 n 的 n 个工程师,给你两个数组 speed 和 efficiency ,其中\(speed[i]\)\(efficiency[i]\)分别代表第 i 位工程师的速度和效率。请你返回由最多 k 个工程师组成的 ​​​​​​最大团队表现值 ,由于答案可能很大,请你返回结果对\(10^9 + 7\)取余后的结果。
团队表现值 的定义为:一个团队中「所有工程师速度的和」乘以他们「效率值中的最小值」。

示例 1:
输入:\(n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2\)
输出:60
解释:
我们选择工程师 2(speed=10 且 efficiency=4)和工程师 5(speed=5 且 efficiency=7)。他们的团队表现值为 performance = (10 + 5) * min(4, 7) = 60 。
示例 2:
输入:\(n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3\)
输出:68
解释:
此示例与第一个示例相同,除了 k = 3 。我们可以选择工程师 1 ,工程师 2 和工程师 5 得到最大的团队表现值。表现值为 performance = (2 + 10 + 5) * min(5, 4, 7) = 68 。
示例 3:
输入:\(n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4\)
输出:72

一个trick是要求某个值乘以某个最大(小)值的时候可以通过分解局部最优优化时间复杂度。 难点在于怎么对数组进行遍历解局部最优解。这里,我们可以将局部解认为是:求必须取当前元素且当前元素为最小值的情况下,最优解是什么。最后求局部解的最大值,即是全局最优解。
所以核心思路是:先以效率对所有工程师做降序排序,每次选定一个效率值作为\(x\),从效率值大于 \(x\)的工程师(即左侧的工程师)中找到速度最大的至多\(K-1\)个工程师,从而计算他们的团队表现值。
为了方便的找到效率大于\(x\)的速度最大的\(K-1\)个工程师,使用一个容量为\(K-1\)的小顶堆来维护。

import heapq
class Solution:
    def maxPerformance(self, n: int, speed: List[int], efficiency: List[int], k: int) -> int:
        nums = list(zip(speed,efficiency))
        nums.sort(key = lambda x:-x[1])
        res = sum_ = 0
        min_heap = []
        for i in range(len(nums)):
            eff,spp = nums[i]
            res = max(res,(eff+sum_)*spp)
            if i min_heap[0]:
                num = heapq.heapreplace(min_heap,eff)
                sum_ += eff-num
        return res%(10**9+7)

推荐阅读
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
夏乐迎1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有