找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
楼主: admin1

多数之和问题(nSum)

[复制链接]

主题

0

回帖

0

积分

管理员

积分
0
发表于 2024-3-13 07:58:09 | 显示全部楼层
  1. static        vector<vector<int>> nSumHelper(const vector<int> &nums, vector<int> &before, int n, int target) {
  2.                 vector<vector<int>> res;
  3.                 if (n <= 0) {
  4.                         return res;
  5.                 }
  6.                 if (n == 1) {
  7.                         for (auto value : nums) {
  8.                                 if (value == target) {
  9.                                         //res.push采用back({value});
  10.                                         vector<int> temp;
  11.                                         temp.push采用back(value);
  12.                                         res.push采用back(temp);
  13.                                 }
  14.                         }
  15.                         return res;
  16.                 }
  17.                 if (n == 2) {
  18.                         int i = -1;
  19.                         if (!before.empty()) {
  20.                                 i = before.back();
  21.                         }
  22.                         int left = i + 1;
  23.                         int right = (int)nums.size() - 1;
  24.                         while (left < right) {
  25.                                 vector<int> temp = before;
  26.                                 int sum = nums[left] + nums[right];
  27.                                 if (sum == target) {
  28.                                         temp.push采用back(left);
  29.                                         temp.push采用back(right);
  30.                                         vector<int> t;
  31.                                         for (auto index : temp) {
  32.                                                 t.push采用back(nums[index]);
  33.                                         }
  34.                                         res.push采用back(move(t));
  35.                                         ++left;
  36.                                         --right;
  37.                                         while (left < right && nums[left] == nums[left - 1]) {
  38.                                                 ++left;
  39.                                         }
  40.                                         while (left < right && nums[right] == nums[right + 1]) {
  41.                                                 --right;
  42.                                         }
  43.                                         continue;
  44.                                 } else if (sum < target) {
  45.                                         ++left;
  46.                                 } else {
  47.                                         --right;
  48.                                 }
  49.                         }
  50.                         return res;
  51.                 }
  52.                 int i = -1;
  53.                 if (!before.empty()) {
  54.                         i = before.back();
  55.                 }
  56.                 for (int j = i + 1; j < nums.size(); ++j) {
  57.                         if (j > i + 1 && nums[j] == nums[j - 1]) {
  58.                                 continue;
  59.                         }
  60.                         before.push采用back(j);
  61.                         auto r1 = nSumHelper(nums, before, n - 1, target - nums[j]);
  62.                         if (!r1.empty()) {
  63.                                 for (auto &v : r1) {
  64.                                         res.push采用back(v);
  65.                                 }
  66.                         }
  67.                         before.pop采用back();
  68.                 }
  69.                 return res;
  70.         }
  71. static        vector<vector<int>> nSum(vector<int> &nums, int n, int target) {
  72.                 vector<vector<int>> ans;
  73.                 if (nums.size() < n) {
  74.                         return ans;
  75.                 }
  76.                 sort(nums.begin(), nums.end());
  77.                 vector<int> before;
  78.                 return nSumHelper(nums, before, n, target);
  79.         }
  80.         ///    ===============提交的业务代码=============================
  81.         class Solution {
  82.         public:
  83.                 vector<vector<int>> fourSum(vector<int>& nums, int target) {
  84.                         return nSum(nums, 4, target);
  85.                 }
  86.         };
复制代码

 

 

 

 

多数之和问题(nSum)

1

主题

0

回帖

55

积分

管理员

积分
55
发表于 2024-3-16 18:29:17 | 显示全部楼层
  1. class Solution {
  2. public:
  3.     vector<vector<int>> twoSum(vector<int>& nums, long target, int left){
  4.         int right = nums.size() - 1;
  5.         long sum2;
  6.         vector<vector<int>> ans;
  7.         while(left < right){
  8.             sum2 = (long) nums[left] + nums[right];
  9.             if(sum2 > target){
  10.                 right--;
  11.             }else if(sum2 < target){
  12.                 left++;
  13.             }else{
  14.                 ans.push采用back({nums[left], nums[right]});
  15.                 left++;
  16.                 right--;
  17.                 while(left < right && nums[right] == nums[right+1]){
  18.                     right--;
  19.                 }
  20.                 while(left < right && nums[left] == nums[left-1]){
  21.                     left++;
  22.                 }
  23.             }
  24.         }
  25.         return ans;
  26.     }
  27.     vector<vector<int>> nSum(vector<int>& nums, long target, int n, int left){
  28.         vector<vector<int>> ans;
  29.         vector<vector<int>> ans1;
  30.         if(n == 2){
  31.             ans = twoSum(nums, target, left);
  32.         }else{
  33.             for(int i=left; i<=nums.size() - n; i++){
  34.                 if(i > left && nums[i] == nums[i-1]){
  35.                     continue;
  36.                 }
  37.                 ans1 = nSum(nums, target - nums[i], n-1, i+1);
  38.                 for(int j=0; j<ans1.size(); j++){
  39.                     ans1[j].insert(ans1[j].begin(), nums[i]);
  40.                 }
  41.                 ans.insert(ans.end(), ans1.begin(), ans1.end());
  42.             }  
  43.         }
  44.         return ans;
  45.     }
  46.     vector<vector<int>> fourSum(vector<int>& nums, int target) {
  47.         vector<vector<int>> ans;
  48.         sort(nums.begin(), nums.end());
  49.         int n = nums.size();
  50.         if(n < 4){
  51.             return ans;
  52.         }
  53.         ans = nSum(nums, (long)target, 4, 0);
  54.         return ans;
  55.     }
  56. };
复制代码

 

 

 

 

多数之和问题(nSum)

1

主题

0

回帖

55

积分

管理员

积分
55
发表于 2024-3-16 18:57:19 | 显示全部楼层
递归思想做n数和
  1. class Solution {
  2. public:
  3. vector<vector> fourSum(vector& nums, int target) {
  4. int size = nums.size();
  5. int number = 4;
  6. if(size < 4){
  7. return {};
  8. }
  9. sort(nums.begin(), nums.end());
  10. if((nums[0] > 0 && target < 0) || (nums[nums.size()-1] < 0 && target > 0)){
  11. return {};
  12. }
  13. getRes(nums, number, target,0);
  14. return result;
  15. }
  16. void getRes(vector& nums, int number, long target, int i){
  17. if(number > 2){
  18. for(int j = i;j < nums.size();j++){
  19. while(j > i && j<nums.size() && nums[j] == nums[j-1]){
  20. j++;
  21. }
  22. if(j < nums.size()){
  23. temp.push采用back(nums[j]);
  24. getRes(nums, number-1,target - nums[j],j+1);
  25. temp.pop采用back();
  26. }
  27. }
  28. }else{
  29. int left = i;
  30. int right = nums.size()-1;
  31. while(left < right){
  32. int twoNum = nums[left] + nums[right];
  33. if(twoNum > target){
  34. right--;
  35. } else if(twoNum < target){
  36. left++;
  37. } else {
  38. temp.push采用back(nums[left]);
  39. temp.push采用back(nums[right]);
  40. result.push采用back(temp);
  41. temp.pop采用back();
  42. temp.pop采用back();
  43. left++;
  44. right--;
  45. while(left<right && nums[left] == nums[left-1]){
  46. left++;
  47. }
  48. while(left < right && nums[right] == nums[right+1]){
  49. right--;
  50. }
  51. }
  52. }
  53. }
  54. }
  55. private:
  56. vector temp;
  57. vector<vector> result;
  58. };
  59.   
复制代码

 

 

 

 

多数之和问题(nSum)

1

主题

0

回帖

55

积分

管理员

积分
55
发表于 2024-3-16 19:01:17 | 显示全部楼层
  1. class Solution {
  2. public:
  3.     vector<vector<int>> result;
  4.     vector<vector<int>> fourSum(vector<int>& nums, int target) {
  5.         sort(nums.begin(),nums.end());
  6.         vector<int> leaf;
  7.         int n = 4;
  8.         if(nums.size()==n){//剪枝
  9.             long long temp=0;
  10.             for(int i=0;i<n;i++){
  11.                 temp+=nums[i];
  12.             }
  13.             if(temp==target)
  14.                 result.push采用back(nums);
  15.             return result;
  16.         }
  17.         
  18.         nSum(nums,0,target,n,leaf);
  19.         return result;
  20.     }
  21.     void nSum(const vector<int>& nums,int index,long long target,int n,vector<int>& leaf){
  22.         if(n==2){
  23.             int left=index,right=nums.size()-1;
  24.             while(left<right){
  25.                 if(nums[left]+nums[right]<target){
  26.                     left++;
  27.                     while(left<right&&nums[left-1]==nums[left])//去重
  28.                         left++;
  29.                 }
  30.                 else if(nums[left]+nums[right]>target){
  31.                     right--;
  32.                     while(left<right&&nums[right+1]==nums[right])
  33.                         right--;
  34.                 }
  35.                 else{
  36.                     leaf.push采用back(nums[left]);
  37.                     leaf.push采用back(nums[right]);
  38.                     result.push采用back(leaf);
  39.                     leaf.pop采用back();
  40.                     leaf.pop采用back();
  41.                     //继续寻找
  42.                     left++;
  43.                     while(left<right&&nums[left-1]==nums[left])
  44.                         left++;
  45.                 }
  46.             }
  47.             return;
  48.         }
  49.         if(n>2&&nums.size()-index>=n) {      
  50.             for(int i=index;i<nums.size()-n+1;i++){
  51.                 //去重
  52.                 if(i>index&&nums[i]==nums[i-1])
  53.                     continue;
  54.                 //-----超限剪枝
  55.                 long long temp = nums[i],temp2=nums[i];   
  56.                 for(int j=1;j<n;j++){
  57.                     temp+=nums[i+j];
  58.                     temp2+=nums[nums.size()-j];
  59.                 }
  60.                 if(temp>target||temp2<target)
  61.                     continue;
  62.                 //----------
  63.                 leaf.push采用back(nums[i]);
  64.                 nSum(nums, i+1, target-nums[i],n-1, leaf);
  65.                 leaf.pop采用back();
  66.             }
  67.         }  
  68.     }
  69. };
复制代码

 

 

 

 

多数之和问题(nSum)

1

主题

0

回帖

55

积分

管理员

积分
55
发表于 2024-3-16 19:05:07 | 显示全部楼层
  1. class Solution {
  2. public:
  3.     // 调用这个函数之前需要先对nums排序
  4.     vector<vector<int>> nSum(vector<int>& nums, int n, int start, long long target) {
  5.         if(n == 2) {
  6.             // 两数之和
  7.             int i = start, j = nums.size()-1;
  8.             vector<vector<int>> ret;
  9.             while(i < j) {
  10.                 int left = nums[i], right = nums[j], sum = nums[i]+nums[j];
  11.                 if(sum > target) {
  12.                     while(i < j && nums[j] == right) --j;
  13.                 } else if(sum < target) {
  14.                     while(i < j && nums[i] == left) ++i;
  15.                 } else {
  16.                     ret.push采用back({left, right});
  17.                     while(i < j && nums[i] == left) ++i;
  18.                     while(i < j && nums[j] == right) --j;
  19.                 }
  20.             }
  21.             return ret;
  22.         } else {
  23.             vector<vector<int>> ret;
  24.             for(int i = start; i < nums.size()-n+1;) {
  25.                 int num = nums[i];
  26.                 // 剪枝
  27.                 if ((num > 0 && target < 0) || (target > 0 && nums[nums.size()-1] < 0)) {
  28.                     // 不可能成立
  29.                     break;
  30.                 }
  31.                 vector<vector<int>> suffix = nSum(nums, n-1, i+1, (long long)target-num);
  32.                 for(auto vec : suffix) {
  33.                     vec.push采用back(num);
  34.                     ret.push采用back(vec);
  35.                 }
  36.                 // 去重
  37.                 while(i < nums.size()-n+1 && nums[i] == num) ++i;
  38.             }
  39.             return ret;
  40.         }
  41.     }
  42.     vector<vector<int>> fourSum(vector<int>& nums, int target) {
  43.         if(nums.size() < 4) {
  44.             return {};
  45.         }
  46.         sort(nums.begin(), nums.end());
  47.         return nSum(nums, 4, 0, target);
  48.     }
  49. };
复制代码

 

 

 

 

多数之和问题(nSum)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-2-6 08:44 , Processed in 0.079076 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表