1606. Find Servers That Handled Most Number of Requests
有k个服务器处理一些请求,第i个请求需要第i%k服务器来处理,如果服务器繁忙,则按序号向下找;找到末尾后再从头开始,如果所有的服务器都忙,那么该请求被丢弃。给定一些请求的到达时间和需要处理的时间,问处理最多个请求的服务器有哪些。
方法一:比赛时没有做出,后来想想发现挺简单的,用一个堆来维护繁忙的服务器,用一个有序的列表维护可用的服务器,环的问题比较难想,但是其实处理起来很简单,就是当找到末尾不够用时,使用队首的服务器就可以了。
1 | def busiestServers(self, k: int, arrival: List[int], load: List[int]) -> List[int]: |
215. Kth Largest Element in an Array
找出数组中最大的第K个数。原题
快排的思想,没有通过LeetCode测试用例,因为内存超出了限制。
1 | def findKthLargest(self, nums, k): |
1 | def findKthLargest(self, nums: List[int], k: int) -> int: |
1 | def findKthLargest(self, nums: List[int], k: int) -> int: |
703. Kth Largest Element in a Stream
流中第K个大的数。原题
1 | int k = 3; |
方法一:还是使用堆,一开始没想到切分,所以超时了。注意是heapreplace
。
1 | class KthLargest: |
1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
最长的连续子数组,绝对值不大于limit。原题
1 | Input: nums = [8,2,4,7], limit = 4 |
方法一:堆,Time: O(NlogN)
1 | def longestSubarray(self, nums: List[int], limit: int) -> int: |
1631. Path With Minimum Effort
找出一条左上到右下的路径,路径中体力消耗为最大的两个格子的差,找到能走到右下的最小消耗值,可以走上下左右。
1 | Input: heights = [[1,2,2],[3,8,2],[5,3,5]] |
方法一:作为竞赛3题,1个小时都没有想出来,想法想偏了,因为如果只能走右和下,那么问题很简单,是一个dp问题。所以一开始也往dp方向考虑。实际上通过数据范围的上限可以考虑二分法 + bfs。效率不高,4000ms。
1 | def minimumEffortPath(self, g: List[List[int]]) -> int: |
方法二:Dijikstra’s算法。堆,堆的方法比方法一快很多,哟还那个是700ms。核心是维护一个dist
用来记录每个点的最小距离。
1 | def minimumEffortPath(self, g: List[List[int]]) -> int: |
778. Swim in Rising Water
和1631几乎一样,从左上到右下,经过的所有点的最大值最小。
1 | Input: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]] |
方法一:二分法。
1 | def swimInWater(self, grid: List[List[int]]) -> int: |
1 | def swimInWater(self, grid: List[List[int]]) -> int: |
1642. Furthest Building You Can Reach
一个人在爬一群建筑物,当建筑物比当前高时,需要一个梯子和高度差个砖块,给你一些梯子和砖块,问最远能走到哪里。
1 | Input: heights = [4,2,7,6,9,14,12], bricks = 5, ladders = 1 |
方法一:竞赛时想偏了,超时了。这里有点贪心的思维,需要爬升的次数优先使用梯子,如果不够了,使用高度差最小的用砖块替代,如果不够了,证明走得是最远了。
1 | def furthestBuilding(self, heights: List[int], bricks: int, ladders: int) -> int: |
1675. Minimize Deviation in Array
将奇数*2,或者偶数除2,返回可以将数组最大值最小值差最小是多少。
1 | Input: nums = [4,1,5,20,3] |
方法一:将所有奇数变成偶数,这个时候所有的值都是最大的,包括最小值。然后每次将最大的值除2,来降低上限。注意这个过程中最小值可能更新。使用堆来做优先级队列。
1 | def minimumDeviation(self, nums: List[int]) -> int: |
1439. Find the Kth Smallest Sum of a Matrix With Sorted Rows
二维数组每行有序,从每行选出一个数字,所有的行累加和第K小的是多少。
1 | Input: mat = [[1,3,11],[2,4,6]], k = 5 |
方法一:可以暴力,但是不能使用product
,那样复杂度太高了
1 | def kthSmallest(self, mat: List[List[int]], k: int) -> int: |
方法二:使用堆作为优先级队列,枚举每行向右移动一位。
1 | def kthSmallest(self, mat: List[List[int]], k: int) -> int: |