zoukankan      html  css  js  c++  java
  • leetcode5897.将数组分成两个数组并最小化数组和的差

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

    请你返回 最小 的数组和之差。

    输入:nums = [3,9,7,3]
    输出:2
    解释:最优分组方案是分成 [3,9] 和 [7,3] 。
    数组和之差的绝对值为 abs((3 + 9) - (7 + 3)) = 2 。

    输入:nums = [-36,36]
    输出:72
    解释:最优分组方案是分成 [-36] 和 [36] 。
    数组和之差的绝对值为 abs((-36) - (36)) = 72 。

    输入: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
    -107 <= nums[i] <= 107

    ////https://leetcode-cn.com/problems/partition-array-into-two-arrays-to-minimize-sum-difference/
    #include <bits/stdc++.h>
    using namespace std;
    #define N 100005
    #define ll long long int
    #define mod 1e9 + 7
    class Solution {
    public:
        int minimumDifference(vector<int>& v) {
            int n = v.size() / 2, ans = mod;
            vector<vector<int> > pr(n + 1), la(n + 1);
            for(int i = 0; i < ( 1 << n); i++){
            	int sum = 0, cnt  =__builtin_popcount(i);
            	for(int j = 0; j < n; j++){
            		if(i & (1 << j)) sum += v[j];
            		else sum -= v[j];
            	}
            	pr[cnt].push_back(sum);
            }
            for(int i = 0; i < ( 1 << n); i++){
            	int sum = 0, cnt = __builtin_popcount(i);
            	for(int j = 0; j < n; j++){
            		if(i & ( 1 << j)) sum += v[j + n];
            		else sum -= v[j + n];
            	}
            	la[cnt].push_back(sum);
            }
            for(int i = 0; i <= n; i++){
            	sort(pr[i].begin(), pr[i].end());
            	sort(la[i].begin(), la[i].end());
            }
            for(int i = 0; i <= n; i++){
            	for(int x : pr[i]){
            		auto it = lower_bound(la[n - i].begin(), la[n - i].end(), -x);
            		if(it != la[n - i].end()) ans = min(ans, abs(x + *it));
            		if(it != la[n - i].begin()) ans = min(ans, abs(x + *prev(it)));
            	}
            }
            return ans;
        }
    };
    int main(){
    	vector<int> v1 = {3,9,7,3};
    	vector<int> v2 = {-36, 36};
    	vector<int> v3 = {2,-1,0,4,-2,-9};
    	string s1 = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT";
    	string s2 = "AAAAAAAAAAAAA";
    	Solution solution;
    	cout << solution.minimumDifference(v1) << endl;
    	cout << solution.minimumDifference(v2) << endl;
    	cout << solution.minimumDifference(v3) << endl;
    	return 0;
    }
    
  • 相关阅读:
    day28-描述符应用与类的装饰器
    MySQL-快速入门(8)存储过程、存储函数
    MySQL-快速入门(7)索引
    MySQL-快速入门(6)连接查询、子查询、正则表达式查询、数据的插入删除更新
    MySQL-快速入门(5)数据查询-常用关键字、分组查询、聚合函数
    MySQL-快速入门(4)MySQL函数
    MySQL-快速入门(3)运算符
    MySQL-快速入门(2)数据类型
    MySQL-快速入门(1)基本数据库、表操作语句
    MySql-Mysql技术内幕~SQL编程学习笔记(N)
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/15389244.html
Copyright © 2011-2022 走看看