刷题《面试经典150题》(第九天)

发布于:2024-05-08 ⋅ 阅读:(34) ⋅ 点赞:(0)

学习目标:


学习内容:

  • 跳跃游戏 II - 力扣(LeetCode)
  • H 指数 - 力扣(LeetCode)
  • 盛最多水的容器 - 力扣(LeetCode)
  • 矩阵置零 - 力扣(LeetCode)
  • 最小栈 - 力扣(LeetCode)

学习时间:

4.30

知识点

学习内容:

跳跃游戏 II - 力扣(LeetCode)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i] i + j < n 返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达
nums[n - 1]。

示例 1:

输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:

输入: nums = [2,3,0,1,4] 输出: 2

这道题可真恶心,想法是用bfs,可是一直超时超时超时!!!

道心破碎,时间怎么来都是超时
抄答案吧呜呜呜

class Solution:
    def jump(self, nums: List[int]) -> int:
        n = len(nums)
        maxPos, end, step = 0, 0, 0
        for i in range(n - 1):
            if maxPos >= i:
                maxPos = max(maxPos, i + nums[i])
                if i == end:
                    end = maxPos
                    step += 1
        return step

H 指数 - 力扣(LeetCode)

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h
指数。

根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h
篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。

示例 1:

输入:citations = [3,0,6,1,5] 输出:3 解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3,
0, 6, 1, 5 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
示例 2:

输入:citations = [1,3,1] 输出:1

直接暴力出答案

class Solution(object):
    def hIndex(self, citations):
        """
        :type citations: List[int]
        :rtype: int
        """
        h=1
        if len(citations)==1:
            if citations[0]==0:
                return 0
            else:
                return h
        for i in range(len(citations)):   #一共有n篇论文,h指数介于1和n之间,所以遍历n次
            sum=0           #用来记录引用次数大于h指数的数量
            for j in citations:         #j是每篇论文引用的次数,如果j>h,则sum+1
                if j>=h:
                    sum+=1
                if sum>=h:
                    break           #已经满足当前h指数的要求了
            if sum<h:
                break               #本次的h指数不满足,停止循环
            h+=1
        return h-1
if __name__ == "__main__":
    a=Solution()
    citations = [11,15]
    print(a.hIndex(citations))

盛最多水的容器 - 力扣(LeetCode)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

在这里插入图片描述

输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组
[1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:

输入:height = [1,1] 输出:1

终于碰到一道正常题了,这个应该不难吧,如果不懂的话,可以留言,评论。我将秒回复~~~

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        left=0
        right = len(height)-1
        max_water = -1
        while left<right:
            max_water=max(max_water,min(height[left],height[right])*(right-left))
            if height[left]<height[right]:
                left+=1
            else:
                right-=1
        return max_water



if __name__ == "__main__":
    a=Solution()
    height=[1,2,1]
    print(a.maxArea(height))

矩阵置零 - 力扣(LeetCode)

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

示例 1:

在这里插入图片描述

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

在这里插入图片描述

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

比上一题还简单

class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        r=len(matrix)       #行
        c=len(matrix[0])    #列
        qr=[]   #存行
        qc=[]   #存列
        for i in range(r):
            for j in range(c):
                if matrix[i][j] == 0:
                    if i not in qr:
                        qr.append(i)
                    if j not in qc:
                        qc.append(j)
        for i in qr:    #第i行
            for k in range(c):
                matrix[i][k]=0
        for j in qc:
            for k in range(r):
                matrix[k][j]=0
        return matrix

if __name__ == "__main__":
    a=Solution()
    matrix = [[1,1,1],[1,0,1],[1,1,1]]
    print(a.setZeroes(matrix))

最小栈 - 力扣(LeetCode)

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop()
删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int getMin() 获取堆栈中的最小元素。

示例 1:

输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出: [null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

class MinStack(object):

    def __init__(self):
        self.stack = []
        self.mins = 1<<32


    def push(self, val):
        """
        :type val: int
        :rtype: None
        """
        self.stack.append(val)
        self.mins = min(self.stack)


    def pop(self):
        """
        :rtype: None
        """
        self.stack.pop()
        if len(self.stack)!=0:
            self.mins = min(self.stack)
        else:
            self.mins = 1<<32


    def top(self):
        """
        :rtype: int
        """
        return self.stack[-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.mins


# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
if __name__ == "__main__":
    obj = MinStack()
    obj.push(-2)
    obj.push(0)
    obj.push(-3)
    obj.getMin()
    obj.pop()
    obj.pop()
    obj.top()
    obj.getMin()

最后成果

  • 跳跃游戏 II - 力扣(LeetCode)
  • H 指数 - 力扣(LeetCode)
  • 盛最多水的容器 - 力扣(LeetCode)
  • 矩阵置零 - 力扣(LeetCode)
  • 最小栈 - 力扣(LeetCode)

结论

道友,加油!!