当前位置: 首页 > 知识库问答 >
问题:

确定大O:在数组中找到4个不同的数字,求和为S

谭桐
2023-03-14

给定一个数arr和一个数S的数组,在arr中找到4个不同的数,其总和为S。

编写一个函数,获取arr和S,并返回一个数组,其中包含arr中此类数字的4个索引。

我提出的解决方案涉及递归地建立索引组合,同时确保不会多次计算组合。我还通过确保解决方案集的大小不超过4来修剪搜索树。

#include <iostream>
#include <vector>
using namespace std;

bool find_sol(vector<int> &N, vector<int> &I, int S, int sum){
  if (I.size() == 4)
    if (S == sum)
      return true;
    else
      return false;
  for (int i = 0; i < N.size(); ++i){
    if (I.empty() || I[I.size()-1] < i){
      I.push_back(i);
      if (find_sol(N,I,S,sum+N[i]))
        return true;
      else {
        I.pop_back();
      }
    }
  }
  return false;
}

int main(){
  int S = 23;
  vector<int> numbers = {1,3,5,6,7,8,9};
  vector<int> indices;
  find_sol(numbers,indices,S,0);

  // prints 0, 2, 5, 6
  for (int i = 0; i < indices.size(); ++i)
    cout << indices[i] <<" ";
  cout<<endl;

  return 0;
}

我如何确定这个算法的运行时间?我觉得它类似于O(n选择4),但不确定。解决方案告诉我最佳运行时间是O(n^2)。

共有1个答案

隗锐进
2023-03-14

您的解决方案确实是O(nC4)=O(n^4),因为它会找到所有可能的组合并检查它们——对于每个组合,都需要不断的额外工作。

它可以在O(n^2)中通过首先填充哈希映射(std::unordered_map)来完成,其中键是数组中所有对的求和,并且值指向这些值的索引。填充此映射是O(n^2)平均大小写。

然后,再次迭代所有对,对于带有sumd的每对i, j,在哈希映射中查找是否有带有keyS-d的条目。

注意:您还需要确保此条目不包含来自i, j的索引。为了能够处理它,您的map值实际上可能是一个成对向量。

作为旁注,这个问题被称为子集求和问题,放宽了4个元素正好与目标求和的限制(经典问题对此没有限制)

 类似资料:
  • 问题内容: 最近有人要求我为一份工作编写3个测试程序。它们将仅使用核心Java API和我选择的任何测试框架来编写。应在适当的地方实施单元测试。 尽管我根本没有收到任何反馈,但我想他们不喜欢我的解决方案(否则我会收到他们的来信),所以我决定在这里展示我的程序,并询问这种实现是否可以认为是好的,并且,如果没有,那为什么呢? 为避免混淆,我现在只问第一个。 实现一个函数,以在另一个更大的数组中查找一个

  • 给定一个2d数组,我需要返回一个具有路径的矩阵,该路径递归地求和到给定的数字。 路径矩阵应为零,但总计为给定数字的路径除外,该路径将标记为1。 路径只能在 我尝试过所有的可能性,首先检查我是否已经去过下一个街区。 问题是在一些迭代之后,它会停止,并且不会返回并再次将块清除为0。 给定 在通话中 我以为算法会回来 我得到 相反 调用paintPath(mat1400,path,0,0);我想 或 问

  • 我有这样一个数组: 1,2,3,4,5。 我想找出每一个可能的三元组的总和,比如:123、124、125、134、135等等 我曾尝试使用3个while循环和3个变量(I,j,k)迭代每个三元组,但时间复杂度是O(n^3),我希望是O(n^2)。 希望有人来帮忙。

  • 问题内容: 我有一个练习,需要在 不使用数组的情况下 将4个数字升序排列,然后再降序 排列 。我只能使用循环和if语句。我已经用3个数字做到了,但是现在用4个数字我无法想到逻辑。 问题答案: 一种进行小型,固定大小排序的好方法是使用排序网络: 每行编码两个元素之间的比较和交换。 您可以使用此页面为少量输入生成最佳的分类网络。 要以相反的顺序排序,只需将标志翻转为标志即可。

  • 问题内容: 有什么简单的方法或功能可以确定python列表中的最大数量?我只可以编写代码,因为我只有三个数字,但是如果我可以使用内置函数或类似的东西告诉最大的代码,那么它将使代码的冗余度降低很多。 问题答案: 关于什么

  • 我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?