《程式設計之法》2 2尋找和為定值的兩個數

2021-07-15 07:52:56 字數 2750 閱讀 6465

題目描述:輸入乙個整數陣列和乙個整數,在陣列中查詢一對數,滿足它們的和正好等於輸入的那個整數,並輸出任一一對值。

解法一:直接窮舉:

雙層迴圈,複雜度為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 ...