日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給你一個長度為 2 * n 的整數(shù)數(shù)組。
你需要將 nums 分成 兩個 長度為 n 的數(shù)組,分別求出兩個數(shù)組的和,并 最小化 兩個數(shù)組和之 差的絕對值 。
nums 中每個元素都需要放入兩個數(shù)組之一。

請你返回 最小數(shù)組和之差

示例 1: 輸入:nums = [3,9,7,3] 輸出:2 解釋:最優(yōu)分組方案是分成 [3,9][7,3] 。 數(shù)組和之差的絕對值為 abs((3 + 9) - (7 + 3)) = 2 。示例 2: 輸入:nums = [-36,36] 輸出:72 解釋:最優(yōu)分組方案是分成 [-36][36] 。 數(shù)組和之差的絕對值為 abs((-36) - (36)) = 72 。示例 3: 輸入:nums = [2,-1,0,4,-2,-9] 輸出:0 解釋:最優(yōu)分組方案是分成 [2,4,-9][-1,0,-2] 。 數(shù)組和之差的絕對值為 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
著作權歸領扣網(wǎng)絡所有。商業(yè)轉載請聯(lián)系官方授權,非商業(yè)轉載請注明出處。

2. 解題

  • 數(shù)組折半,分別對一半進行狀態(tài)枚舉
  • 枚舉一邊取的數(shù)的個數(shù),將左右的滿足二進制位個數(shù)的狀態(tài)取出,排序,雙指針求解最接近的
  • 時間復雜度 O(n?2n)O(n*2^n)O(n?2n)
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);//獲取所有狀態(tài)的和vector<int> stateSum2 = getsum(b);int dis = INT_MAX;for(int x = 0; x <= n; ++x){ // 第一個數(shù)組取x個數(shù)int y = n-x; // 第二個數(shù)組取y個數(shù)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的個數(shù)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阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。