• 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;
    }
    
  • 相关阅读:
    java中this关键字
    java继承
    java super关键字
    java String类型存储详解
    java四种访问权限修饰符
    C/C++语言void及void指针深层探索【转】
    Linux Epoll介绍和程序实例【转】http://blog.csdn.net/sparkliang/article/details/4770655
    服务器与wp7的socket通信【转】 http://www.cnblogs.com/linzheng/archive/2011/06/21/2086456.html
    android关于socket编程,以聊天为例【转】http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7
    Tesseract 3 语言数据的训练方法【转】http://blog.csdn.net/dragoo1/article/details/8439373
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/15389244.html
Copyright © 2020-2023  润新知