zoukankan      html  css  js  c++  java
  • 数据N个元素的和的组合

    目录

      /*
      写一个函数 void foo(arr, m, n),arr是整数数组,m是个数,n是和,打印所有和为n的
      二维数组,注意兼顾性能。 例子: arr 为[-1,1,2,3,4,5,6] m=2, n=5时,打印 [
      [1,4],[2,3],[-1,6] ] m=3, n=6时,打印[ [-1,1,6], [-1,2,5], [-1,3,4],
      [1,2,3] ]
       */
      #include <iostream>
      #include <vector>
      using namespace std;
      
      void print(vector<vector<int>> group) {
        cout << "[";
        for (auto &pair : group) {
          cout << "[";
          for (auto &item : pair) {
            cout << item << " ";
          }
          cout << "], ";
        }
        cout << "]" << endl;
      }
      
      vector<vector<int>> TwoNumSum(int arr[], size_t len, int argSum) {
        int i = 0, j = int(len) - 1;
        int sum = 0;
        vector<vector<int>> ret;
        while (i < j) {
          sum = arr[i] + arr[j];
          if (sum == argSum) {
            vector<int> group;
            group.push_back(arr[i]);
            group.push_back(arr[j]);
            ret.push_back(group);
            i++;
          } else if (sum < argSum) {
            i++;
          } else {
            j--;
          }
        }
        return ret;
      }
      
      int TwoNumSum(int arr[], size_t len, int argSum, vector<vector<int>> &ret) {
      
        int add = ret.size();
        int i = 0, j = int(len) - 1;
        int sum = 0;
        while (i < j) {
          sum = arr[i] + arr[j];
          if (sum == argSum) {
            vector<int> group;
            group.push_back(arr[i]);
            group.push_back(arr[j]);
            ret.push_back(group);
            i++;
          } else if (sum < argSum) {
            i++;
          } else {
            j--;
          }
        }
        return ret.size() - add;
      }
      
      int NNumSum(int arr[], int arrLen, int num, int argSum,
                  vector<vector<int>> &result) {
        int add = result.size();
        if (num == 2) {
          return TwoNumSum(arr, arrLen, argSum, result);
        } else {
          for (int i = 0; i < arrLen - num; i++) {
            int addNum = NNumSum(&arr[i + 1], arrLen - i - 1, num - 1,
                                 argSum - arr[i], result);
      
            if (addNum) {
              vector<vector<int>>::iterator iter = result.end() - addNum;
              for (; iter != result.end(); iter++) {
                iter->push_back(arr[i]);
              }
            }
          }
        }
        return result.size() - add;
      }
      
      int main() {
        int arr[] = {-1, 1, 2, 3, 4, 5, 6};
        print(TwoNumSum(arr, int(sizeof(arr) / sizeof(int)), 5));
        vector<vector<int>> ret;
        NNumSum(arr, int(sizeof(arr) / sizeof(int)), 3, 6, ret);
        print(ret);
        return 0;
      }
      
    • 相关阅读:
      你真的了解wordwrap和wordbreak的区别吗?
      python入门3——基本数据类型 岳岳
      python入门04——输入输出 岳岳
      第一次计算机理论知识 岳岳
      Web 开发与设计之 Google 兵器谱
      Web 开发与设计之 Google 兵器谱
      Web 开发与设计之 Google 兵器谱
      window.showModalDialog 以及window.open用法简介
      Web 开发与设计之 Google 兵器谱
      Web 开发与设计之 Google 兵器谱
    • 原文地址:https://www.cnblogs.com/ims-/p/13843348.html
    Copyright © 2011-2022 走看看