LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

给你一个长度为 2 * n 的整数数组。
你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 。
nums 中每个元素都需要放入两个数组之一。

请你返回 最小数组和之差

示例 1:
输入:nums = [3,9,7,3]
输出:2
解释:最优分组方案是分成 [3,9][7,3] 。
数组和之差的绝对值为 abs((3 + 9) - (7 + 3)) = 2 。示例 2:
输入:nums = [-36,36]
输出:72
解释:最优分组方案是分成 [-36][36] 。
数组和之差的绝对值为 abs((-36) - (36)) = 72 。示例 3:
输入:nums = [2,-1,0,4,-2,-9]
输出:0
解释:最优分组方案是分成 [2,4,-9][-1,0,-2] 。
数组和之差的绝对值为 abs((2 + 4 + -9) - (-1 + 0 + -2)) = 0 。提示:
1 <= n <= 15
nums.length == 2 * n
-10^7 <= nums[i] <= 10^7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-array-into-two-arrays-to-minimize-sum-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 数组折半,分别对一半进行状态枚举
  • 枚举一边取的数的个数,将左右的满足二进制位个数的状态取出,排序,双指针求解最接近的
  • 时间复杂度 O(n∗2n)O(n*2^n)O(n2n)
class Solution {
public:int minimumDifference(vector<int>& nums) {int n = nums.size()/2;int sum = accumulate(nums.begin(), nums.end(), 0);vector<int> a(nums.begin(),nums.begin()+n), b(nums.begin()+n,nums.end());vector<int> stateSum1 = getsum(a);//获取所有状态的和vector<int> stateSum2 = getsum(b);int dis = INT_MAX;for(int x = 0; x <= n; ++x){ // 第一个数组取x个数int y = n-x; // 第二个数组取y个数vector<int> s1, s2;//把两边取出来的和存储for(int state = 0; state < (1<<n); ++state){if(count1(state)==x)s1.push_back(stateSum1[state]);}for(int state = 0; state < (1<<n); ++state){if(count1(state)==y)s2.push_back(stateSum2[state]);}sort(s1.begin(), s1.end());//排序,双指针,求解最接近的sort(s2.begin(), s2.end());int len1 = s1.size(), len2 = s2.size();int i = 0, j = len2-1;while(i < len1 && j >= 0){dis = min(dis, abs(sum-2*(s1[i]+s2[j])));if(s1[i]+s2[j] > sum-(s1[i]+s2[j]))j--;else if(s1[i]+s2[j] < sum-(s1[i]+s2[j]))i++;elsereturn 0;}}return dis;}vector<int> getsum(vector<int>& num){int n = num.size();vector<int> ans(1<<n);for(int i = 0; i < n; ++i){ans[1<<i] = num[i]; // 初始化}for(int state = 1; state < (1<<n); ++state){int prevstate = state&(state-1);ans[state] = ans[state-prevstate] + ans[prevstate];}return ans;}int count1(int x){ // 计算二进制1的个数int ans = 0;while(x){ans++;x = x&(x-1);}return ans;}
};

692 ms 76.4 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux for循环

一定要记得写后面的分号&#xff1b;http://www.runoob.com/linux/linux-shell-variable.html 这个页面的课程的循环教程是有问题的 for color in yellow green white;do   echo ${color}done 利用循环列出某个目录下的<b>所有</b>文件 for line in ls /tmp/yang…

Visual Studio Code C++配置文件

文章目录tasks.jsonlaunch.jsonc_cpp_properties.json以下三个文件放在 项目下 .vscode 文件夹中&#xff0c;内容从网络收集&#xff0c;经自己实践添加修改以备忘 tasks.json {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the t…

南通大学python期末考试试卷答案_南通大学2015-2016年1学期《软工》作业点评总结...

第一次作业(2015.9.13)作业题目存在问题1.学生可能平时写博客的机会比较少&#xff0c;书写格式存在的问题比较多。比如文字排版、博客中的代码直接粘贴(没有使用代码样式)、插入的图片太大等等。这些问题老师在上课的时候可以专门抽出一节课的时间跟学生讲一下&#xff0c;计算…

android--仿网易新闻主界面

主要是学习ActionBarDrawerLayoutActionBarDrawerToggle,很不错的教程,下面一步一步带你实现这个过程,有不足之处欢迎留言交流.下面先来一张效果图 根据图片分析,要实现的有侧边栏DrawerLayout,ActionBar的颜色和菜单以及ActionBarDrawerToggle的动画效果. 在这之前,Theme要改…

fastapi 查询参数和字符串校验 / 路径参数和数值校验

文章目录1. 约束限制2. 必须参数3. 查询参数列表 / 多个值4. 声明更多元数据5. 别名参数6. 弃用参数7. Path 路径参数8. 按需对参数排序learn from https://fastapi.tiangolo.com/zh/tutorial/query-params-str-validations/ 1. 约束限制 from typing import Optional from f…

python tkinter选择路径控件_如何使用tkinter在Python中选择目录并存储位置

我正在创建一个带有浏览按钮的GUI,我只想返回路径.我一直在使用下面的代码来查找解决方案.Tkinter.Button(subframe, text "Browse", command self.loadtemplate, width 10).pack()def loadtemplate(self):filename tkFileDialog.askopenfilename(filetypes ((&…

python字典速度能比字典高多少_python – 字典访问速度比较与整数键对字符串键...

我有一个大字典&#xff0c;我必须从中寻找价值观很多次。我的键是整数&#xff0c;但代表标签&#xff0c;所以不需要添加&#xff0c;减法等…我最终尝试评估字符串键和整数键字典之间的访问时间&#xff0c;这里是结果。from timeit import TimerDint dict()Dstr dict()fo…

数据库中包含开始时间、结束时间,并且查询条件也有开始时间、结束时间的查询方法...

分类&#xff1a; oracle学习数据库例&#xff1a;考试表中有两个字段&#xff1a;startDate、endDate&#xff0c;分别代表考试开始时间、结束时间。现在需要查询某一时间段内正在进行的考试&#xff0c;实际只要满足考试的时间段和查询条件的时间段有交集即可&#xff0c;包含…

LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色

文章目录1. 题目2. 解题1. 题目 总共有 n 个颜色片段排成一列&#xff0c;每个颜色片段要么是 ‘A’ 要么是 ‘B’ 。 给你一个长度为 n 的字符串 colors &#xff0c;其中 colors[i] 表示第 i 个颜色片段的颜色。 Alice 和 Bob 在玩一个游戏&#xff0c;他们 轮流 从这个字符…

java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。...

1、java自带的proxy类可以创建动态类&#xff0c;如果一个类实现了一个接口那么久可以为这个类创建代理。 2、代理&#xff1a;就是当用户要调用一个类的方法时&#xff0c;用户可以通过调用代理&#xff0c;代理通过接口调用原来的类的方法&#xff0c;代理在把方法给用户前可…

java 当前时间_Java 获取当前时间的小时(24小时制)

var myDate new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1970-????)myDate.getMonth(); //获取当前月份(0-11,0代表1月)myDate.getDate(); //获取当前日(1-31)myDate.getDay(); //获取当前星期X(0-6,0代表星期天)myDate…

LeetCode 2039. 网络空闲的时刻(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个有 n 个服务器的计算机网络&#xff0c;服务器编号为 0 到 n - 1 。 同时给你一个二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示服务器 ui 和 vi 之间有一条信息线路&#xff0c;在 一秒 内它们之间可以传输 任意 数目…

C# 中的占位符本质

占位符本质 1、占位符是相对于String字符串类型而言的。 2、占位符其实就是调用String.Format()方法。把指定的变量拼接到定义好的字符串模板中组成新的字符串。转载于:https://www.cnblogs.com/weber4444/p/4789340.html

java impala_Java实现impala操作kudu

packagecn.itcast.impala.impala;import java.sql.*;public classContants {private static String JDBC_DRIVER"com.cloudera.impala.jdbc41.Driver";private static String CONNECTION_URL"jdbc:impala://node1:21050/default;authnoSasl";//定义数据库连…

java webservice 服务器_java如何写webservice服务端

展开全部Java 中的 Web Service 分为基于 SOAP 的和基于 REST 的两种&#xff0c;下面简单说一个基于 SOAP 的例子。要使用 JDK6u4 之后e69da5e6ba903231313335323631343130323136353331333335313231的版本才能编译通过。先编写一个 Web Service 的接口&#xff1a;WebServiceS…

LeetCode 2040. 两个有序数组的第 K 小乘积(嵌套二分查找)

文章目录1. 题目2. 解题1. 题目 给你两个 从小到大排好序 且下标从 0 开始的整数数组 nums1 和 nums2 以及一个整数 k &#xff0c;请你返回第 k &#xff08;从 1 开始编号&#xff09;小的 nums1[i] * nums2[j] 的乘积&#xff0c;其中 0 < i < nums1.length 且 0 <…

数据库SQL优化大总结之 百万级数据库优化方案(转载)

原文地址&#xff1a;http://www.cnblogs.com/yunfeifei/p/3850440.html 网上关于SQL优化的教程很多&#xff0c;但是比较杂乱。近日有空整理了一下&#xff0c;写出来跟大家分享一下&#xff0c;其中有错误和不足的地方&#xff0c;还请大家纠正补充。 这篇文章我花费了大量的…

java 重写session_关于session的实现:cookie与url重写

本文讨论的语境是java EE servlet。我们都知道session的实现主要两种方式&#xff1a;cookie与url重写&#xff0c;而cookie是首选(默认)的方式&#xff0c;因为各种现代浏览器都默认开通cookie功能&#xff0c;但是每种浏览器也都有允许cookie失效的设置。由于浏览器默认启动c…

LeetCode 2042. 检查句子中的数字是否递增

文章目录1. 题目2. 解题1. 题目 句子是由若干 token 组成的一个列表&#xff0c;token 间用 单个 空格分隔&#xff0c;句子没有前导或尾随空格。 每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 &#xff0c;要么是一个由小写英文字母组成的 单词 。 示例&…

如何在本地搭建svn本地版本库

前提&#xff1a; 安装SVN版本软件 步骤1&#xff1a; rootdebian:svnadmin create /home/svn/back_trunk/rootdebian:cd back_trunk/conf/rootdebian:/home/svn/back_trunk/conf# lsauthz passwd svnserve.conf修改/增加上述三个文件如下&#xff1a; svnserve.conf: anon-acc…