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

创意福州网站建设搜狗收录提交入口网址

创意福州网站建设,搜狗收录提交入口网址,郑州网站建设 郑州网站设计,深圳代做网站Leetcode 416.分割等和子集 题目描述 给定一个非负整数的数组 nums ,你需要将该数组分割成两个子集,使得两个子集的元素和相等。如果可以分割,返回 true ,否则返回 false。 示例 1: 输入:nums [1,5,11,…

Leetcode 416.分割等和子集

题目描述

给定一个非负整数的数组 nums ,你需要将该数组分割成两个子集,使得两个子集的元素和相等。如果可以分割,返回 true ,否则返回 false

示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11]

Java 实现代码

public class Solution {public boolean canPartition(int[] nums) {int sum = 0;for (int num : nums) {sum += num;}// 如果总和是奇数,不能平分if (sum % 2 != 0) {return false;}int target = sum / 2;boolean[] dp = new boolean[target + 1];dp[0] = true; // 和为 0 总是能做到for (int num : nums) {// 从后往前更新 dp 数组for (int j = target; j >= num; j--) {dp[j] = dp[j] || dp[j - num];}}return dp[target];}
}

解题思路

这个问题可以转化为0/1背包问题,我们需要检查是否能在数组中找到一个子集,使得这个子集的和为 sum(nums) / 2。如果可以找到,剩下的元素自然就是另一个子集,两者和相等。

具体步骤:

  1. 首先检查数组总和是否为偶数。如果总和为奇数,直接返回 false,因为无法将其平均分配成两个相等的部分。

  2. 动态规划:定义一个布尔数组 dp,其中 dp[i] 表示是否能够从数组中选取若干个元素,使得它们的和为 i。初始化时,dp[0] = true(因为和为 0 总是可以通过选择空集合得到)。

  3. 遍历数组中的每个元素,对于每个元素,从后往前更新 dp 数组。如果 dp[j - num]true,则说明可以通过添加 num 这个元素使得和为 j,所以设置 dp[j] = true

  4. 最终,判断 dp[target] 是否为 true,其中 target = sum(nums) / 2

复杂度分析

  • 时间复杂度O(n * target),其中 n 是数组 nums 的长度,target 是目标值(即 sum(nums) / 2)。需要遍历每个元素,并且对于每个元素,更新 dp 数组的每个状态。

  • 空间复杂度O(target),我们只需要一个大小为 target + 1 的布尔数组 dp 来存储状态。

执行过程示例

假设 nums = [1, 5, 11, 5]

  1. 计算数组总和:sum = 1 + 5 + 11 + 5 = 22,所以目标是 target = sum / 2 = 11

  2. 初始化 dp 数组:dp[0] = true,其余元素初始化为 falsedp = [true, false, false, false, false, false, false, false, false, false, false, false]

  3. 遍历数组元素,更新 dp 数组:

    • 处理元素 1

      dp[1] = true  // 可以通过选择 1 得到和 1
      dp = [true, true, false, false, false, false, false, false, false, false, false, false]
      
    • 处理元素 5

      dp[6] = true  // 可以通过选择 5 得到和 6
      dp[5] = true  // 可以通过选择 5 得到和 5
      dp = [true, true, false, false, false, true, true, false, false, false, false, false]
      
    • 处理元素 11

      dp[11] = true  // 可以通过选择 11 得到和 11
      dp = [true, true, false, false, false, true, true, false, false, false, false, true]
      
    • 处理元素 5

      dp[10] = true  // 可以通过选择 5 得到和 10
      dp[5] = true   // 可以通过选择 5 得到和 5
      dp = [true, true, false, false, false, true, true, false, false, false, true, true]
      
  4. 最终,dp[11]true,说明可以分割成两个和为 11 的子集,因此返回 true

http://www.mmbaike.com/news/47484.html

相关文章:

  • 简述网页建站流程appstore关键词优化
  • 木马工业产品设计公司深圳搜索seo优化排名
  • 广西建设局网站百度经验官方网站登录入口
  • 网站开发h5技术深圳网站快速排名优化
  • 北京做网站网络公司象山关键词seo排名
  • 网站是哪家公司做的新网站推广方法
  • 政府采购网供应商注册独立站谷歌seo
  • 网站幻灯片 字段重庆网站建设
  • 开发网站需要什么语言体彩足球竞彩比赛结果韩国比分
  • 帮别人做海报网站seo服务价格表
  • 二类电商用网站怎么做H5页面关键词优化系统
  • 淘宝网站建设方案手机端搜索引擎排名
  • 网站建设张景鹏seo网络推广技术
  • 北京网站制作公司排名海南百度推广总代理
  • 如何注册网站名称国际国内新闻最新消息今天
  • 滨江区网站开发公司站长之家综合查询工具
  • 怎么查公司营业执照信息西安seo代理
  • 如何看网站做的好坏东莞做网站哪个公司好
  • 个人网站制作新手教程莆田seo推广公司
  • 极速网站建设定制多少钱seo软件系统
  • 广州微网站建设优书网首页
  • wordpress limitseo主要是指优化
  • 南宁做网站开发的公司凡科小程序
  • 卖菜网站应该怎么做帮收款的接单平台
  • 删负面的网站手机网站制作教程
  • 上海 网站建设公司跨境电商关键词工具
  • 怎么用css做网站背景图百度云网盘资源链接
  • 本地佛山顺德网站设计网络营销课程作业
  • 自己做网站统计深圳市龙华区
  • 怎样用dw做网站电脑优化软件