74. Search a 2D Matrix(第七周)

Description

Search a 2D Matrix - LeetCode

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.

For example

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]

Given target = 3, return true.

Solution

我们可以把一个这个矩阵看成一维的数组,然后使用二分法进行快速查找就好。
首先我们先得到矩阵(vector< vector< int>>)的长宽(m, n)。

然后我们就可以对矩阵进行二分查找了,先进行基本的null判断,然后进行通过长宽求出这个矩阵元素的个数(m * n - 1),再求出出最中间的元素的序号。

然后就是进行循环,在循环开始之前,我们首先记录下开头(low)和结尾(high)的序号,然后进行对中间值的取值并且判断,如果判断相等,则返回true,如果判断中间的值比target要小,就要往大的一半去找,所以要把low赋值为mid + 1(mid为中间的序号)。一直做这个循环,直到最后lowhigh要大或者找到了target返回了值并且跳出了循环。

Source Code

submission

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty()) {
            return false;
        }
        int m = matrix.size();
        int n = matrix[0].size();
        int low = 0;
        int high = m * n - 1;
        int mid = (low + high) / 2;
        while (low <= high)
        {
            mid = (low + high) / 2;
            int num = matrix[mid / n][mid % n];

            if (num == target)
            {
                return true;
            }
            else if (num < target)
            {
                low = mid + 1;
            }
            else
            {
                high = mid - 1;
            }
        }
        return false;
    }
};

Thinking

这个题目就是考验我们将复杂的问题转化成简单的已知问题的能力。进行搜索的话应该首先想到二分,而且题目的条件也很符合二分查找,通过对矩阵进行简单的变换,我们就能解出这道题目。

torch.nn.MaxPool2d和torch.nn.AdaptiveMaxPool2d都是PyTorch中的池化层,但是它们有一些不同之处。其中,nn.MaxPool2d是一个传统的池化层,它需要指定池化窗口的大小和步长,然后通过在输入上滑动池化窗口并在每个窗口上取最大值来执行池化操作。这意味着在使用nn.MaxPool2d时,输出的形状是固定的,由输入形状、池化窗口大小和步长共同决定。 而nn.AdaptiveMaxPool2d是自适应池化层,它只需要指定输出大小,而不是池化窗口大小。nn.AdaptiveMaxPool2d会自动计算池化窗口大小和步长,并在每个窗口上执行池化操作,以产生所需的输出大小。这意味着nn.AdaptiveMaxPool2d可以处理任意形状的输入,并生成任意形状的输出。 以下是一个使用nn.MaxPool2d的例子: ```python import torch.nn as nn # 定义一个 3x3 的池化层窗口,步长为2 max_pool = nn.MaxPool2d(kernel_size=3, stride=2) # 定义一个输入,大小为 [batch_size, channel, height, width] input_tensor = torch.randn(1, 3, 10, 10) # 对输入进行池化操作 output_tensor = max_pool(input_tensor) # 打印输出的形状 print(output_tensor.shape) ``` 输出为:torch.Size([1, 3, 4, 4]) 以下是一个使用nn.AdaptiveMaxPool2d的例子: ```python import torch.nn as nn # 定义一个输出大小为 [5, 5] 的自适应池化层 adaptive_max_pool = nn.AdaptiveMaxPool2d(output_size=(5, 5)) # 定义一个输入,大小为 [batch_size, channel, height, width] input_tensor = torch.randn(1, 3, 10, 10) # 对输入进行自适应池化操作 output_tensor = adaptive_max_pool(input_tensor) # 打印输出的形状 print(output_tensor.shape) ``` 输出为:torch.Size([1, 3, 5, 5])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值