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

*算法训练(leetcode)第三十一天 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

刷题记录

  • *1049. 最后一块石头的重量 II
  • *494. 目标和
  • 474. 一和零

*1049. 最后一块石头的重量 II

leetcode题目地址

本题与分割等和子集类似,要达到碰撞最后的石头重量最小,则尽可能把石头等分为两堆。

时间复杂度: O ( m ∗ n ) O(m * n) O(mn)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum = 0;for(int i=0; i<stones.size(); i++){sum += stones[i];}int target = sum/2;vector dp(target+1, 0);for(int i=0; i<stones.size(); i++){for(int j=target; j>=stones[i]; j--){dp[j] = max(dp[j], dp[j-stones[i]]+stones[i]);}}return sum - dp[target] - dp[target];}
};

*494. 目标和

leetcode题目地址

nums中元素初始均为正,先求其和sum。若|target|>sum,则无解。

需要推导出递推公式:设“+”数之和为X,则“-”数之和就是sum-X,其中,sum和target为已知。
可得递推公式: X − ( s u m − X ) = t a r g e t X-(sum-X) = target X(sumX)=target
解得: X = ( t a r g e t + s u m ) / 2 X = (target + sum) / 2 X=(target+sum)/2

因此, (target + sum) % 2 != 0时 无解。

一维dp数组记录背包容量为j时可以组成target的方案数量。

例如:target = 5

  • 当前已有1,则有dp[4]种方案
  • 当前已有2,则有dp[3]种方案
  • 当前已有k,则有dp[target-k]种方案

时间复杂度: O ( n ∗ m ) O(n*m) O(nm)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum = 0;for(int i=0; i<nums.size(); i++){sum += nums[i];}if(fabs(target)>sum) return 0;if((sum+target)%2!=0) return 0;vector<int> dp((target+sum)/2+1, 0);dp[0] = 1;for(int i=0; i<nums.size(); i++){for(int j=(target+sum)/2; j>=nums[i]; j--){dp[j] += dp[j-nums[i]]; }}return dp[(target+sum)/2];}
};

474. 一和零

leetcode题目地址

使用二维dp数组,横纵坐标分别代表0和1的背包容量,即dp[i][j]代表至多包含i个0和j个1的最多子串个数。

状态转移方程: d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − z e r o N u m ] [ j − o n e N u m ] + 1 ) dp[i][j] = max( dp[i][j], dp[i-zeroNum][j-oneNum]+1 ) dp[i][j]=max(dp[i][j],dp[izeroNum][joneNum]+1)

时间复杂度: O ( m ∗ n ∗ k ) O(m*n*k) O(mnk)
空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

// c++
class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<int> zeros(strs.size(), 0);vector<int> ones(strs.size(), 0);for(int i=0; i<strs.size(); i++){for(int j=0; j<strs[i].size(); j++){if(strs[i][j] == '0') zeros[i]++;else ones[i]++;}}vector<vector<int>> dp(m+1, vector<int>(n+1, 0));for(int k=0; k<strs.size(); k++){for(int i=m; i>=zeros[k]; i--){for(int j=n; j>=ones[k]; j--){dp[i][j] = max(dp[i][j], dp[i-zeros[k]][j-ones[k]]+1);}}}return dp[m][n];}
};
http://www.lryc.cn/news/407387.html

相关文章:

  • mac中如何使用obs推流以及使用vlc播放
  • shopee虾皮 java后端 一面面经 整体感觉不难
  • HydraRPC: RPC in the CXL Era——论文阅读
  • pve笔记
  • typecho仿某度响应式主题Xaink
  • springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step
  • GPT-4o mini小型模型具备卓越的文本智能和多模态推理能力
  • Milvus 向量数据库进阶系列丨部署形态选型
  • 【React】详解受控表单绑定
  • 使用puma部署ruby on rails的记录
  • 如何在Linux上使用Ansible自动化部署
  • scrapy爬取城市天气数据
  • 一天搞定React(5)——ReactRouter(下)【已完结】
  • 微信小程序之计算器
  • 【logstash】logstash使用多个子配置文件
  • 暴风骑士S9电摩上市,定义青少年骑行安全新标准
  • spring security如何适配盐存在数据库中的密码
  • Go语言编程 学习笔记整理 第2章 顺序编程 后半部分
  • 美团后端二面
  • 学懂C语言(十六):对C语言作用域规则 局部变量、全局变量的认识
  • 关于TS(typescript)的理论知识
  • 【OpenCV C++20 学习笔记】基本图像容器——Mat
  • 枚举单例是怎么保证线程安全和防止反射的
  • 传知代码-智慧医疗:纹理特征VS卷积特征(论文复现)
  • 数据结构中的八大金刚--------八大排序算法
  • ACC2.【C语言】经验积累 栈区简单剖析
  • c# 索引器
  • 低代码如何加速数字化转型
  • Pytest进阶之fixture的使用(超详细)
  • GitHub 详解教程