zoukankan      html  css  js  c++  java
  • LeetCode——一和零

    Q:在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。

    注意:
    给定 0 和 1 的数量都不会超过 100。
    给定字符串数组的长度不会超过 600。

    示例 1:
    输入: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3
    输出: 4
    解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0001","1","0" 。
    示例 2:
    输入: Array = {"10", "0", "1"}, m = 1, n = 1
    输出: 2
    解释: 你可以拼出 "10",但之后就没有剩余数字了。更好的选择是拼出 "0" 和 "1" 。

    A:
    变体0-1背包问题。注意由于每个字符串只能使用一次(即有限背包),因此在更新 dp(i, j) 时,i 和 j 都需要从大到小进行枚举。

          public int findMaxForm(String[] strs, int m, int n) {
            if (strs.length == 0)
                return 1;
            int[][] sum = new int[strs.length][2];//存放每个str里面的0和1个数
            int sum0 = 0;
            int sum1 = 0;
            for (int i = 0; i < strs.length; i++) {
                String str = strs[i];
                int count0 = 0;
                int count1 = 0;
                for (int j = 0; j < str.length(); j++) {
                    if (str.charAt(j) == '0')
                        count0++;
                    else
                        count1++;
                }
                sum[i][0] = count0;
                sum[i][1] = count1;
                sum0 += count0;
                sum1 += count1;
            }
            if (sum0 <= m && sum1 <= n) {//总数过大
                return strs.length;
            }
            int[][] dp = new int[m + 1][n + 1];
            for (int i = 0; i <= m; i++) {
                Arrays.fill(dp[i], 0);
            }
            for (int[] num : sum) {
                for (int i = m; i >= num[0]; i--) {//从大到小枚举
                    for (int j = n; j >= num[1]; j--) {
                        dp[i][j] = Math.max(dp[i - num[0]][j - num[1]] + 1, dp[i][j]);//最大最小背包问题
                    }
                }
            }
            return dp[m][n];
        }
    
  • 相关阅读:
    Redis简介 安装 注册服务
    Supervisor Linux守护进程
    .Net5 控制台 读取配置文件+依赖注入
    Linux Gdip
    Net Core封装 踩坑
    Apollo 公共Namespace使用json
    Visual Studio 2019修改项目名
    【面向对象】--静态类与非静态类的区别
    win10设置默认中英文符号【程序员标配】
    MySQL 数据库访问驱动-版本问题
  • 原文地址:https://www.cnblogs.com/xym4869/p/13030362.html
Copyright © 2011-2022 走看看