1553. 吃掉 N 个橘子的最少天数

写算法对于引用集合类型的尽量使用全局变量,特别是记忆化递归搜索的题

1553. 吃掉 N 个橘子的最少天数

厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子:

  • 吃掉一个橘子。
  • 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。
  • 如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。

每天你只能从以上 3 种方案中选择一种方案。

请你返回吃掉所有 n 个橘子的最少天数。

示例 1:

输入:n = 10
输出:4
解释:你总共有 10 个橘子。
第 1 天:吃 1 个橘子,剩余橘子数 10 - 1 = 9。
第 2 天:吃 6 个橘子,剩余橘子数 9 - 2*(9/3) = 9 - 6 = 3。(9 可以被 3 整除)
第 3 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。
第 4 天:吃掉最后 1 个橘子,剩余橘子数 1 - 1 = 0。
你需要至少 4 天吃掉 10 个橘子。

示例 2:

输入:n = 6
输出:3
解释:你总共有 6 个橘子。
第 1 天:吃 3 个橘子,剩余橘子数 6 - 6/2 = 6 - 3 = 3。(6 可以被 2 整除)
第 2 天:吃 2 个橘子,剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。(3 可以被 3 整除)
第 3 天:吃掉剩余 1 个橘子,剩余橘子数 1 - 1 = 0。
你至少需要 3 天吃掉 6 个橘子。

示例 3:

输入:n = 1
输出:1

示例 4:

输入:n = 56
输出:6

思考:对于这个题,假定“吃掉一个橘子”为“操作1”,“吃掉 n/2 个橘子”为“操作2”,“吃掉 2*(n/3) 个橘子”为“操作3”。

我们首先可以猜想一下,尽量多用操作2和操作3,对于操作1尽量少用。

同时可以总结一个公式

f ( x ) = { 1 , x = 1 m i n [ f ( x − 1 ) , f ( x / 2 ) , f ( x / 3 ) ] + 1 , x 为 6 的 倍 数 m i n [ f ( x − 1 ) , f ( x / 2 ) ] , x 是 2 的 倍 数 m i n [ f ( x − 1 ) , f ( x / 3 ) ] , x 是 3 的 倍 数 f ( x − 1 ) + 1 , x 为 其 他 数 f(x) = \left\{\begin{matrix} 1, & x = 1 \\min[f(x - 1),f(x / 2),f(x / 3)] + 1 , & \text x为6的倍数 \\min[f(x - 1),f(x / 2)] ,& \text x是2的倍数 \\min[f(x - 1),f(x / 3)] ,& \text x是3的倍数 \\f(x - 1) + 1 , & \text x为其他数 \end{matrix}\right. f(x)=1,min[f(x1),f(x/2),f(x/3)]+1,min[f(x1),f(x/2)],min[f(x1),f(x/3)],f(x1)+1,x=1x6x2x3x

这个证明参照官方题解

class Solution {
    
     HashMap<Integer, Integer> map = new HashMap<>(1024);
     public int minDays(int n) {    
        if (n <= 1) {
            return n;
        }
        if (map.containsKey(n)) {
            return map.get(n);
        }
        map.put(n,Math.min(n % 2 + 1 + minDays(n / 2),n % 3 + 1 + minDays(n / 3)));
        return map.get(n);
    }
}

在这里要说明一点,这里用的是记忆化搜索,每次需要用到上次map.put()的结果,因此需要将HashMap作为全局变量,否则放到里面去,如下

class Solution {
    
     public int minDays(int n) {
        HashMap<Integer, Integer> map = new HashMap<>(1024);
        if (n <= 1) {
            return n;
        }
        if (map.containsKey(n)) {
            return map.get(n);
        }
        map.put(n,Math.min(n % 2 + 1 + minDays(n / 2),n % 3 + 1 + minDays(n / 3)));
        return map.get(n);
    }
}

提交就会报错

image-20210503105252503

因此算法小白的我在这儿涨个经验教训,记忆化搜索用到的集合类型之类的尽量用全局变量。

### 回答1: datasets.ImageFolder函数可以帮助你从文件夹中加载图像数据集,比如,你可以使用它从一个文件夹中加载一组图像,每个文件夹代表一个类别,比如,你可以使用datasets.ImageFolder函数加载一个包含苹果和橘子的图像数据集,其中一个文件夹存储苹果的图像,另一个文件夹存储橘子的图像。 ### 回答2: datasets.imagefolder函数是在torchvision包中的一个函数,它用于加载一个文件夹中的图像数据集,并将其转换为PyTorch中的Dataset对象。下面是一个关于datasets.imagefolder函数的例子: 假设我们的数据集存储在一个名为"dataset"的文件夹中,文件夹的结构如下所示: dataset/ ├── class1/ │ ├── image1.jpg │ ├── image2.jpg │ └── image3.jpg └── class2/ ├── image4.jpg ├── image5.jpg └── image6.jpg 现在我们想将这个数据集加载为一个PyTorch的Dataset对象,并进行必要的转换和预处理。我们可以使用datasets.imagefolder函数来实现这个目标。 首先,我们需要导入相关的库和模块: from torchvision import datasets from torchvision.transforms import transforms 然后,我们可以创建一个transforms对象,用于对图像进行必要的转换和预处理: transform = transforms.Compose([ transforms.Resize((256, 256)), # 将图像的大小调整为256x256像素 transforms.ToTensor(), # 转换图像为Tensor形式 transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 归一化图像 ]) 接下来,我们可以使用datasets.imagefolder函数加载数据集并进行必要的转换和预处理: dataset = datasets.ImageFolder(root='dataset', transform=transform) 现在,我们可以通过索引dataset对象来访问数据集中的图像和标签: image, label = dataset[0] # 获取第一张图像和对应的标签 最后,我们可以通过遍历dataset对象来获取整个数据集的图像和标签: for image, label in dataset: # 对图像和标签进行相应的操作,如训练、测试等 这就是关于datasets.imagefolder函数的一个例子。它可以帮助我们加载图像数据集,并进行必要的转换和预处理,以便进行后续的深度学习任务。 ### 回答3: datasets.imagefolder函数是在PyTorch中用于加载图像数据集的函数之一。它可以将一个文件夹中的图像数据集加载到内存中,并按照预设的规则对图像进行预处理和标准化。 举个例子来解释这个函数的用法:假设我们有一个包含猫和狗的图像数据集,文件夹结构如下: - dataset/ - cat/ - cat1.jpg - cat2.jpg - cat3.jpg ... - dog/ - dog1.jpg - dog2.jpg - dog3.jpg ... 我们可以使用datasets.imagefolder函数来加载这个图像数据集。首先,我们需要导入必要的库: ``` import torch from torchvision import datasets from torchvision.transforms import transforms ``` 接下来,我们定义一些图像预处理和标准化的操作。这些操作将在图像加载时自动应用到每个图像上: ``` transform = transforms.Compose([ transforms.Resize((224, 224)), # 将图像调整为指定大小 transforms.ToTensor(), # 转换为张量格式 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 标准化图像 ]) ``` 然后,我们可以使用datasets.imagefolder函数加载数据集: ``` dataset = datasets.ImageFolder('dataset', transform=transform) ``` 这里的'dataset'是数据集所在的路径,transform参数是我们定义的预处理和标准化操作。加载完数据集后,我们可以通过索引来访问其中的图像和标签: ``` image, label = dataset[0] # 获取第一个图像和标签 ``` 这样,我们就可以通过datasets.imagefolder函数将图像数据集加载到内存中,并对图像进行预处理和标准化后,进行后续的模型训练或其他操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值