当前位置: 首页 > news >正文

淘宝优惠网站怎么做深圳设计网站费用

淘宝优惠网站怎么做,深圳设计网站费用,国内国际时事写实记录2024,网站首页网址阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此题一看应该就是需要用到动态规划算法&#xff0c;假设我们以 f[d]表示总和为 d 的元素组合的个数&#xff0c;首先&#xff0c;我们遍历 nums 数组&#xff0c; 如果有 nums[i] < target&#xff0c;那么组…

阅读目录

    • 1. 题目
    • 2. 解题思路
    • 3. 代码实现

1. 题目

2. 解题思路

此题一看应该就是需要用到动态规划算法,假设我们以 f[d]表示总和为 d 的元素组合的个数,首先,我们遍历 nums 数组,

如果有 nums[i] < target,那么组合中第一个元素我们放置 nums[i],组合中余下元素的排列总个数也就变成了子问题 f[target - nums[i]]

如果有 nums[i] = target,那么组合中只能放置 nums[i]这一个元素。

3. 代码实现

于是,我开始实现了第一版代码,完全就照着上面的解题思路来写,使用递归。

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {int ret = 0;for (int i = 0; i < nums.size(); ++i) {if (nums[i] < target) {ret += combinationSum4(nums, target-nums[i]);}else if (nums[i] == target) {ret += 1;}}return ret;}
};

很可惜,没有通过全部测试用例,超时了。

超出时间限制 10 / 16 个通过的测试用例

这里,计算 f[target - nums[i]]的时候有可能存在大量重复,比如,nums=[1, 2, 3, 4], target=5,第一个元素我们放置 2 时,需要计算 f(3)。然后,如果前两个元素我们都放置 1 时,也需要计算 f(3)

所以,一个很自然的思路就是把已经计算过的 f(d)记录下来,下次遇到可以直接用。

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {static vector<int> target_ret(1001, -1);int ret = 0;for (int i = 0; i < nums.size(); ++i) {if (nums[i] < target) {int left = target - nums[i];if (target_ret[left] == -1) {target_ret[left] = combinationSum4(nums, left); }ret += target_ret[left];}else if (nums[i] == target) {ret += 1;}}return ret;}
};

于是,我定义了一个静态数组,全部初始化为 -1,计算一个 f(d) 后就把它记录下来,下次直接使用,不用再递归去调用一次函数。

但是,这次直接变成解答错误了。我把错误的用例单独拿出来测试,答案是对的。去网上一查,原来 LeetCode 会用这同一个类去测试所有的测试用例,那么我的静态数组就会受到前一个测试用例的影响,所以,答案也就是错的了,此路看来也不通!

那就只能手动递推了,因为我们最终要计算 f(target) ,而 f(target) 可能依赖于 f(target-1)、f(target-2)....f(1),所以我们就从 1 开始,一个一个往后计算 f(d) 即可。

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<int> target_ret(target+1, 0);for (int j = 1; j <= target; ++j) {for (int i = 0; i < nums.size(); ++i) {if (nums[i] < j) {int left = j - nums[i];target_ret[j] += target_ret[left];}else if (nums[i] == j) {target_ret[j] += 1;}}}return target_ret[target];}
};

很不幸,还是出错了,看起来是整型数超出表示范围了,一个简单的思路是把 int 换成 unsigned int,终于成功了!

Line 16: Char 35: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type ‘int’ (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:25:35

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned int> target_ret(target+1, 0);for (int j = 1; j <= target; ++j) {for (int i = 0; i < nums.size(); ++i) {if (nums[i] < j) {int left = j - nums[i];target_ret[j] += target_ret[left];}else if (nums[i] == j) {target_ret[j] += 1;}}}return target_ret[target];}
};

要细究为什么会越界的话,其实题目描述里特别说明了 :

题目数据保证答案符合 32 位整数范围。

但是这里只是说 f(target) 不会越界,我们从 1 遍历到 target 的某个中间变量可能越界了,然后这个中间变量实际上是用不到的。

比如,nums=[2, 6, 9], target=15f(14) 是不会用到的,但是我们也会计算它。

时间复杂度为 O ( t a r g e t ∗ n u m s . s i z e ( ) ) O(target*nums.size()) O(targetnums.size()),空间复杂度为 O ( t a r g e t ) O(target) O(target)

如果数组中存在负数的话,会存在一个包含正数和负数的序列,它们的和为 0,也就是说,可以无限添加这个序列,而和保持不变,这样,f(target) 就是无穷的了。

http://www.yayakq.cn/news/384400/

相关文章:

  • 网站怎么设置二级域名网站 建设ppt
  • 做流量哪个网站好义乌国际贸易综合信息服务平台
  • 温州网站建设活动wordpress自动跳转
  • 建设网站的注意事项查询建设工程施工规范网站
  • 土特产直营建设网站的调研成都网站建设熊掌号
  • php整站开发 企业网站教程智能网站设计哪家好
  • 玉溪做网站公司中国建筑集团有限公司怎么样
  • WordPress主题页面模板不见了seo营销型网站推广
  • 东莞h5网站制作做网站的骗术
  • 网站建设1自学网站开发软件开发
  • 专注苏州网站优化前程无忧做简历网站
  • 新乡手机网站建设官网怎样找做淘宝客的网站
  • 免费域名申请网站大全推荐北京网站设计工作室
  • 淘宝商城的网站建设公司注册网站怎么做
  • 基于多站点的网站内容管理平台的管理与应用2015年做那个网站能致富
  • 中国摄影网站中国机械加工网18易5下2拉i
  • 丹阳企业网站制作电商数据分析师
  • 云速成美站vi设计的简介
  • 江苏科技大学新校区建设网站做网站除了广告还有什么收入的
  • 中国网站有哪些公司自助建站系统php
  • dw做的网站怎么传到网络上去公众号怎么推广产品
  • 购物网站订单状态模板wordpress教程主题
  • dede网站301怎么做桂林生活网官方网站
  • 网站开发人员的要求wordpress 设计干货模板
  • 网站 大气新浪军事网
  • 开源手机网站建站系统wordpress英文语言包
  • 广东省农业农村厅官方网站服装网站开发方案swot
  • 短租房网站哪家做最好设计素材网站推荐2023
  • 做soho的网站辽宁城乡建设集团网站
  • 大型门户网站设计公司网站优化 毕业设计