• 416. Partition Equal Subset Sum


    /**
     * Created by haoge-pc on 2017/10/17.
     * 一个非空,全正的整数数组,判断能否划分成两个和相等的子数组
     */
    public class Q416PartitionEqualSubsetSum {
        public boolean canPartition(int[] nums) {
            int sum = 0;
            for (int num :
                    nums) {
                sum += num;
            }
            if (sum%2 != 0)
                return false;
            sum /= 2;
            Boolean[] dp = new Boolean[sum+1];
            Arrays.fill(dp,false);
            dp[0] = true;
            //遍历从sum到0的每个整数,看是否能由数组中的数组成
            //判断的方式是看i-num是否是true,是的话由于当前有num,所以i可以拼成
            //把num都要检查一遍,所以复杂度是o(sum * n)
            for (int num: nums)
            {
                for (int i = sum; i >= 0; i--) {
                    //两种情况说明这个i可以拼成:一种是在前边的检查中已经验证可以拼成了,另一种是这次才验证了可以拼成
                    dp[i] = dp[i] || dp[i-num];
                }
            }
            return dp[sum];
        }
    }

    这个题最重要的一个方法:一个数组判断能不能相加凑出来一个数sum

    方法是:判断sum到0的每个整数是否能被拼凑出来

    对于每个数组中的数num都进行一次从sum到num的判断

    设置一个动态规划的数组,dp[i]记录i能否被凑出来,dp[i] = dp[i] || dp[i-num]

    || 前边你的若是ture则代表这个已经被验证了可以,后边的true说明可以i-num可以,加上本次的数是num,所以i也可以被拼出来

  • 相关阅读:
    MyEclipse无法破解的某种解决方法
    SDK Manager无法打开,闪退问题
    虚拟机不能ping通宿主机问题的解决
    Ubuntu下文件编码转换
    二、vertica安装实践
    搭建Samba服务器
    vmtools安装
    一、vertica 安装注意事项
    MFC如何配置使用Win7风格的控件而不是XP风格控件
    VS静态编译
  • 原文地址:https://www.cnblogs.com/stAr-1/p/7683654.html
Copyright © 2020-2023  润新知