題目描述:輸入乙個整數陣列和乙個整數,在陣列中查詢一對數,滿足它們的和正好等於輸入的那個整數,並輸出任一一對值。
解法一:直接窮舉:
雙層迴圈,複雜度為o(n^2);
#include using namespace std;
void directenum(int nums, int n, int len)
} if(flag) break; }}
int main();
while(cin >> n)
directenum(nums, n, 20);
return 0;
}
解法二:排序後查詢:先對陣列sort排序,之後遍歷陣列,對於每乙個遍歷的數x,二分查詢n-x是否在該陣列中,時間複雜度為o(nlogn)+o(n*logn)=o(nlogn);
#include #include using namespace std;
bool division(int nums, int pos, int x, int low, int high)
else if(nums[mid] > x)
else
} if(tag == 1 && mid != pos)//需要是一對數,故不能為它本身
return true;
return false;
}void sortenum(int nums, int n, int len) }}
int main();
while(cin >> n)
sortenum(nums, n, 20);
return 0;
}
解法三:雜湊排序:假設所有的整數介於0~100間,以時間換空間,設定hash[n],每輸入乙個數x,就令hash[x]=1。判斷時只需遍歷一遍陣列,看是否對應的hash[n-s[i]]為1即可,時間複雜度為o(n),針對空間複雜度,假設陣列中有些數大於n,此時沒必要給這些數設定hash空間了,因為它們不可能與另外的數累加得到n,故空間複雜度也為o(n);
#include using namespace std;
void hashenum(int nums, int hash, int n, int len) }}
int main();
while(cin >> n)
hashenum(nums, hash, n, 20);
} return 0;
}//此時輸入200,無輸出
解法四:排序夾逼:若此時陣列是有序的,則可令時間複雜度為o(n),若是無序的,時間複雜度為o(nlogn) + o(n),空間複雜度都為o(1)。設定兩個指標begin和end分別指向陣列尾端,分別向右向左移動,每次依據a[begin]+a[end]的值與n進行比較,若該值小於n,說明需要a[begin]太小,begin指標需右移;若該值大於n,說明a[end]較大,end指標需左移。
#include #include using namespace std;
void twosum(int nums, int n, int len)
else }}
int main();
while(cin >> n)
twosum(nums, n, 20);
return 0;
}
舉一反三:尋找樹中和為定值的所有路徑輸入一棵二叉樹和乙個整數,從樹的根結點開始向下訪問,一直到葉結點。如下,輸入整數22和該二叉樹,則列印兩條路徑:10-->12和10-->5-->7。
演算法分析:二叉樹可以用陣列進行儲存,可以先分配乙個陣列,如下的二叉樹,從下標1開始存放根結點,將不存在的結點在陣列中用-1存放。根據二叉樹的性質,結點編號為i的左右孩子結點編號為2i, 2i+1,故可以利用圖的深度遍歷方式從根結點一直往下訪問,遇到-1則比較並輸出,如下:
int n, t, path[22], tree[110], loc;//path存放路徑
void dfs(int cur)
cout << endl;
} return;
} //深度遞迴
3個數和為定值問題:以解法三為例,對於每個數a,則對應另外兩個數的和為-a,之後再進行遍歷,對於遍歷到的每個數b,看對應hash[-a-b+offset]是否為1,時間複雜度為o(n^2);
用解法一效仿,時間複雜度為o(n^3);用解法二做,為o(nlogn)+o(n*n*logn)=o(n^2logn);用解法四做,為o(nlogn)+o(n*n)=o(n^2)。最好分配乙個標記陣列來數本身去掉重複的情況。
程式設計之法 2 2 尋找和為定值的兩個數
輸入乙個整數和乙個整數陣列,在陣列中查詢一對數,滿足他們的和正好是輸入的那個整數,如果有多對數的和等於輸入的整數,輸出任意一對即可。例如,如果輸入陣列 1,2,4,5,7,11,15 和整數15,那麼由於4 11 15,因此表明存在兩個數能相加為15。include include include ...
程式設計之法 面試和演算法心得(尋找和為定值的兩個數)
輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。咱們試著一步一步解決這個問題 注意闡述中數列有序無序的區別...
《程式設計之法》 尋找和為定值的多個數
輸入兩個整數n和sum,要求從數列1,2,3,n中隨意取出幾個數,使得它們的和等於sum,請將其中所有的可能的組合列出來。這是個01揹包問題。考慮是否取第n個數的策略,問題可以轉化為乙個只與前n 1個數相關的問題,也就是 1 如果取第n個數,那麼問題就轉化為 取前n 1個數使得它們的和為sum n ...