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

news/2024/9/8 18:37:39 标签: 算法, leetcode, c++

刷题记录

  • *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.niftyadmin.cn/n/5575416.html

相关文章

【初阶数据结构篇】顺序表的实现(赋源码)

文章目录 本篇代码位置顺序表和链表1.线性表2.顺序表2.1 概念与结构2.2分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.3.1动态顺序表的初始化和销毁及打印2.3.2动态顺序表的插入动态顺序表的尾插动态顺序表的头插动态顺序表的在指定位置插入数据 2.3.3动态顺序表…

贪心+背包

这道题比较坑的就是我们的对于相同截止时间的需要排个序&#xff0c;因为我们这个工作是有时间前后顺序的&#xff0c;我们如果不排序的话我们一些截止时间晚的工作就无法得到最优报酬 #include<bits/stdc.h> using namespace std;#define int long long int t; int n; c…

Dify中HTTP请求节点的常见操作

HTTP节点包括API请求类型&#xff08;GET、POST、HEAD、PATCH、PUT、DELETE&#xff09;&#xff0c;鉴权类型&#xff08;无、API-Key基础、API-Key Bearer、API-Key自定义&#xff09;&#xff0c;HEADERS键值设置&#xff0c;PARAMS键值设置&#xff0c;BODY&#xff08;non…

11 Vue 项目插件

UI 插件 Element-UI – Vue2 PC端组件库Element Plus – Vue3 PC端组件库Vant 2 – Vue2移动端组件库Vant 3 – Vue3 移动端组件库vue-quill-editorvue – Vue富文本编辑器nprogress – 进度条插件vue-teble-with-tree-gridvue – 表格树型展示插件screenfull – 页面全屏插件e…

Git 子仓(Git Submodule)学习

Git 子仓学习 Git 子仓&#xff08;Submodule&#xff09;是 Git 提供的一种功能&#xff0c;用于在一个 Git 仓库&#xff08;称为主仓库或 superproject&#xff09;中嵌入另一个 Git 仓库&#xff08;称为子仓或 submodule&#xff09;。这种功能在管理大型项目或依赖关系较…

谷粒商城实战笔记-59-商品服务-API-品牌管理-使用逆向工程的前后端代码

文章目录 一&#xff0c; 使用逆向工程生成的代码二&#xff0c;生成品牌管理菜单三&#xff0c;几个小问题 在本次的技术实践中&#xff0c;我们利用逆向工程的方法成功地为后台管理系统增加了品牌管理功能。这种开发方式不仅能快速地构建起功能模块&#xff0c;还能在一定程度…

数字货币MACD指标自动化交易策略实现(含源代码)

数字货币MACD指标自动化交易策略实现&#xff08;含源代码&#xff09; 前情回顾MACD 策略逻辑代码实现代码说明 增加仓位管理逻辑代码实现修改说明 增加风险控制功能代码实现修改说明 前情回顾 在前面我们实现了2中方法进行数字货币交易&#xff0c;同时还能获取到实时行情。…

c#自动关闭 MessageBox 弹出的窗口

第一种方法&#xff1a; 原理&#xff1a; 1、我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的&#xff0c;只有关闭了MessageBox的窗口后才会运行下面的代码。 2、所以可以考虑在MessageBox前先增加一个用于“杀”掉MessageBox窗口的线程。因为需要…