![](/img/trans.png)
[英]Is there any way to reduce time complexity to find this matrix to the power n?
[英]Is there any way to merge two (or multiple) for loops to reduce the overall time complexity?
實際上我已經解決了比較計算結果並返回最小值的問題。 雖然我成功地實現了邏輯並很好地執行了代碼,但未能降低時間復雜度。
#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, ((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;
}
那么我怎樣才能降低這個的時間復雜度呢?
(array[i] & array[j]) ^ (array[i] | array[j])
等價於array[i] ^ array[j]
( &
, ^
, |
都是按位運算;寫出真值表一點點)。
為了最小化異或,最重要的是高位一致。 假設輸入有幾個數字0xxxx
和幾個數字1xxxx
。 嘗試使用0xxxx
和1xxxx
的配對是沒有意義的; 即使xxxx
部分完全相同,異或也是10000
,而任何0xxxx
與任何0xxxx
的異或,或任何1xxxx
與任何1xxxx
的異或最多為01111
,小於10000
。
在每個組中的下一位重復此邏輯,之后的下一位,可以顯示具有最小 XOR 的對以排序順序彼此相鄰出現。 因此,您可以對數組進行排序並計算n − 1
相鄰對的最小值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.