有没有办法合并两个或多个for 循环来降低整体时间复杂度?

问题描述

其实我已经解决了比较计算结果和返回最小值的问题。虽然我成功地实现了逻辑并精细地执行了代码,但未能降低时间复杂度。

#include<iostream>
#include<algorithm>
#include<climits>

using namespace std;

int checkMinimum(int array[],int index)
{
  int result = INT_MAX;

  for(int i = 0; i < index; ++i)
    for(int j = 0; j < index; ++j)
      if(i != j && (min(result,((array[i] & array[j]) ^ (array[i] | array[j]))) < result))
        result = min(result,((array[i] & array[j]) ^ (array[i] | array[j])));

  return result;
}

void getMinimum()
{
  int index;
  cin >> index;
  int array[index];

  for(int i = 0; i < index; ++i)
    cin >> array[i];

  cout << checkMinimum(array,index) << endl;
}

int main()
{
  int limit;
  cin >> limit;
  while(limit--)
    getMinimum();

  return 0;
}

在研究了 for 循环并试图将它们合并在一起之后,完全没有帮助,因为很难将循环的条件合二为一。

#include<iostream>
#include<algorithm>
#include<climits>

using namespace std;

int checkMinimum(int array[],int index)
{
  int result = INT_MAX;

  for(int i = 0,j = index - 1; i != j; ++i,--j)
    if((min(result,((array[i] & array[j]) ^ (array[i] | array[j]))) < result))
      result = min(result,index) << endl;
}

int main()
{
  int limit;
  cin >> limit;
  while(limit--)
    getMinimum();

  return 0;
}

那么我怎样才能减少这个的时间复杂度?

解决方法

checklist(state,county,id) 等价于 checklistitem(checklist_id)(array[i] & array[j]) ^ (array[i] | array[j])array[i] ^ array[j]& 都是按位运算;写真值表为一位)。>

为了最小化XOR,最重要的是高位位一致。假设输入有几个数字 ^ 和几个数字 |。尝试用 0xxxx1xxxx 配对是没有意义的;即使 0xxxx 部分完全相同,XOR 也是 1xxxx,而任何 xxxx 与任何 10000 的 XOR,或任何 {{1} } 与任何 0xxxx 最多为 0xxxx,小于 1xxxx

在每个组内的下一位和之后的一位重复此逻辑,可以显示具有最小 XOR 的对按排序顺序彼此相邻。因此,您可以对数组进行排序并计算 1xxxx 相邻对的最小值。