問題:給定兩個公升序排序的有序陣列a和b,以及乙個目標值x。陣列下標從0開始。請你求出滿足a[i] + b[j] = x的數對(i, j)。
經驗:做這種型別的題目先使用暴力方法求解,然後分析其規律,再考慮優化解法,比如雙指標解法。
1、暴力解法(時間複雜度o(n*n)):
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++)
if (a[i] + b[j] == x) pfintf("輸出結果!");
2、根據給出的公升序排序的有序陣列a和b,可以使用單調性來解決這個問題。
//i為a陣列首位值,j為b陣列末尾值
for (int i = 0; i < n; i ++)
//a陣列從最小的數(起始值)開始與b陣列最大的數(末尾值)進行相加,如果大於x,則b陣列末尾數j往前移動一位,直到a + b <= x.
這樣求出來的時間複雜度為o(n + m)。
給定兩個公升序排序的有序陣列a和b,以及乙個目標值x。陣列下標從0開始。
請你求出滿足a[i] + b[j] = x的數對(i, j)。
資料保證有唯一解。
輸入格式
第一行包含三個整數n,m,x,分別表示a的長度,b的長度以及目標值x。
第二行包含n個整數,表示陣列a。
第三行包含m個整數,表示陣列b。
輸出格式
共一行,包含兩個整數 i 和 j。
資料範圍
陣列長度不超過100000。
同一陣列內元素各不相同。
1≤陣列元素≤1091≤陣列元素≤109
輸入樣例:
4 5 6
1 2 4 7
3 4 6 8 9
輸出樣例:
1 1
#include #include using namespace std;
const int n = 100010;
int n, m, x;
int a[n], b[n];
int main()
}return 0;
}
演算法基礎課 陣列元素的目標和
還是雙指標。暴力解法複雜度為o n 2 找到單調性後可以降到o n m 暴力解法 對於每個a陣列的元素,遍歷每個b陣列的元素,檢視是否和為目標值。由於陣列有序,所以可以找到規律。單調性解法 如果a的某個元素和b的某個元素加起來剛好大於x,b元素再往前挪就小於x了。此時,如果a的元素向後移動,和該b元...
基礎演算法 陣列配對
description 陣列配對任務描述 給你乙個長度為n的陣列a和乙個正整數k,問從陣列中任選兩個數使其和是k的倍數,有多少種選法對於陣列a1 1,a2 2,a3 2而言 a1,a2 和 a2,a1 被認為是同一種選法 input 輸入n,k,n 1000000,k 1000,第二行有n個整數,大...
演算法 陣列和視窗 陣列
給定乙個整型陣列arr和乙個大小為w的視窗,視窗從陣列最左邊滑動到最右邊,每次向右滑動乙個位置,求出每一次滑動時視窗內最大元素的和。輸入第一行為用例個數,每個測試用例輸入的第一行為陣列,每乙個元素使用空格隔開 第二行為視窗大小。輸出每個測試用例結果。14 3 5 4 3 3 6 7 3 陣列與視窗 ...