【每日一题Day27】LC805数组的均值分割 | 01背包

简介: 当能够分成两个等均值的数组时,均值为固定值,即为数组nums的均值AVE,推导如下,nA和nB分别代表数组A和数组B的长度,sum为数组nums的和,a=average(A) = average(B)

数组的均值分割【LC805】


给定你一个整数数组 nums


我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) == average(B) 。


如果可以完成则返回true , 否则返回 false 。


**注意:**对于数组 arr , average(arr) 是 arr 的所有元素除以 arr 长度的和。


You are given an integer array nums.


You should move each element of nums into one of the two arrays A and B such that A and B are non-empty, and average(A) == average(B).


Return true if it is possible to achieve that and false otherwise.


Note that for an array arr, average(arr) is the sum of all the elements of arr over the length of arr.


做了好久做出来了,很有很有成就感


  • 思路:转化为01背包问题


。当能够分成两个等均值的数组时,均值为固定值,即为数组nums的均值AVE,推导如下,nA和nB分别代表数组A和数组B的长度,sum为数组nums的和,a=average(A) = average(B)


  • nA * a + nB * a = sum


  • a = sum/(nA+nB)=AVE


。因此如果能够找到任意n个数的和为均值AVE的n倍时,即可分割成两个等均值的数组


。每个元素只有取或者不取两种可能性,因此可以转化为01背包问题


  • 01背包问题实现


。背包的体积为sum


。背包要放入的商品(集合里的元素)重量为元素的个数(每个元素为1),价值为 元素的数值


。背包中每一个元素是不可重复放入。


。要求:找到一个背包的容量为nA,存满时其存在价值大小为AVE*nA,sumA = sum/n * nA


  • 因为存在浮点数,所以将等式改为sumA * n = sum * nA


二维动态规划


1.确定dp数组(dp table)以及下标的含义


dp[i][j]表示 表示是否能从 nums 中选 i个数使它们的和为 j

背包总容量为j时,能否装满背包所需的元素个数为i。


2.确定递推公式


。放元素nums[k]


当当前遍历元素为nums[k]时,如果dp[-1][j] = true,那么dp[i] [j+nums[k]]= true


。不放元素nums[k]:dp[i][j] = dp[i][j]


3.dp数组如何初始化


dp[0][0] = true;


4.确定遍历顺序


按顺序遍历每个物品,先逆序遍历背包容量i【避免重复放入同一个物品】,再正序遍历背包价值j


5.举例推导dp数组


  • 代码


class Solution {
    public boolean splitArraySameAverage(int[] nums) {
        int len = nums.length;
        if (len <= 1){
            return false;
        }
        int sum = 0;
        for (int i = 0; i < len; i++){
            sum += nums[i];
        }
        boolean[][] dp = new boolean[len + 1][sum + 1];
        dp[0][0] = true;
        for (int k = 0; k < len ; k++){
            for (int i = k + 1; i >= 1; i--){
                for (int j = 0; j <= sum; j++){
                    if (dp[i-1][j] && j + nums[k] <= sum){
                        dp[i][j+nums[k]] = true;
                        if ( i != 0 && i != len && (j + nums[k]) * len  == sum * i){
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
}


。复杂度


  • 时间复杂度:O ( n 2 ∗ s u m ) ,n为数组长度,sum为数组和
  • 空间复杂度:O ( n ∗ s u m ) ,dp数组大小


  • 将二维数组转换为HashSet数组,set[n]代表当选取n个元素时,和可能的值


class Solution {
    public boolean splitArraySameAverage(int[] nums) {
        int len = nums.length;
        if (len <= 1){
            return false;
        }
        int sum = 0;
        for (int i = 0; i < len; i++){
            sum += nums[i];
        }
        Set<Integer>[] dp = new Set[len + 1];
        for (int i = 0; i <= len; i++) {
            dp[i] = new HashSet<Integer>();
        }
        dp[0].add(0);
        for (int k = 0; k < len ; k++){
            for (int i = k + 1; i >= 1; i--){
                for (int x : dp[i-1]){
                    int curSum = x + nums[k];
                    if (i != 0 && i != len && curSum * len == sum * i){
                        return true;
                    }
                    dp[i].add(curSum);
                }
            }
        }
        return false;
    }
}


目录
相关文章
|
算法
【Leetcode-70.爬楼梯 -88.合并两个有序数组】
【Leetcode-70.爬楼梯 -88.合并两个有序数组】
82 0
|
8月前
|
人工智能 安全 数据库
AiCodeAudit-基于Ai大模型的自动代码审计工具
本文介绍了基于OpenAI大模型的自动化代码安全审计工具AiCodeAudit,通过图结构构建项目依赖关系,提高代码审计准确性。文章涵盖概要、整体架构流程、技术名词解释及效果演示,详细说明了工具的工作原理和使用方法。未来,AI大模型有望成为代码审计的重要工具,助力软件安全。项目地址:[GitHub](https://github.com/xy200303/AiCodeAudit)。
|
网络协议 前端开发 安全
websocket和http的瓜葛以及websocket协议实现
websocket和http的瓜葛以及websocket协议实现
websocket和http的瓜葛以及websocket协议实现
代码随想录刷题|LeetCode 647. 回文子串 516.最长回文子序列
代码随想录刷题|LeetCode 647. 回文子串 516.最长回文子序列
代码随想录刷题|LeetCode 647. 回文子串 516.最长回文子序列
|
机器学习/深度学习 前端开发 程序员
用O(1)的时间复杂度删除链表节点
用O(1)的时间复杂度删除链表节点
用O(1)的时间复杂度删除链表节点
|
自然语言处理 人机交互 语音技术
阿里云智能语音交互中录音文件识别服务的简单使用
智能语音交互产品基于语音识别、语音合成、自然语言理解等技术,实现“能听、会说、懂你”式的智能人机交互体验,适用于智能客服、质检、会议纪要、实时字幕等多个企业应用场景,识别是针对已经录制完成的录音文件,进行离线识别的服务。录音文件识别是非实时的,识别的文件需要提交基于HTTP可访问的URL地址,不支持提交本地文件。此篇文章简单介绍下javasdk的调用
1190 0
阿里云智能语音交互中录音文件识别服务的简单使用
|
Ubuntu 数据库
Ubuntu下使用Git_3
这里是我举得小白阶段比较困难的地方了,
168 0
Ubuntu下使用Git_3
|
15天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾