還是雙指標。暴力解法複雜度為o(n^2),找到單調性後可以降到o(n+m)。
暴力解法:對於每個a陣列的元素,遍歷每個b陣列的元素,檢視是否和為目標值。
由於陣列有序,所以可以找到規律。
單調性解法:如果a的某個元素和b的某個元素加起來剛好大於x,b元素再往前挪就小於x了。此時,如果a的元素向後移動,和該b元素加起來也絕對大於x。所以,a元素往後挪,此時b元素肯定要往前挪。所以我們可以從後往前遍歷一次b陣列。
仔細想想,確實應該先用a的最小值和b的最大值加。如果a的最小值和b的某個元素相加都大於x的話,這個b元素後面的元素都不用看了。
給定兩個公升序排序的有序陣列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≤陣列元素≤109
輸入樣例:
4 5 6輸出樣例:1 2 4 7
3 4 6 8 9
1 1
#include
using
namespace std;
int n,m,x;
const
int n=
1e6+10;
int a[n]
,b[n];
intmain()
}return0;
}
基礎演算法 陣列元素目標和
問題 給定兩個公升序排序的有序陣列a和b,以及乙個目標值x。陣列下標從0開始。請你求出滿足a i b j x的數對 i,j 經驗 做這種型別的題目先使用暴力方法求解,然後分析其規律,再考慮優化解法,比如雙指標解法。1 暴力解法 時間複雜度o n n for int i 0 i n i for int...
演算法基礎課筆記
方法步驟 1 確定分界點。一般取q l q r q l r 2 作為樞紐。2 調整區間,左邊的都是小於等於樞紐值,右邊的都是大於等於樞紐值。最重要 3 遞迴處理左右兩段。快速排序模板 void quick sort int q int l int r quick sort q,l,j quick s...
演算法基礎課 陣列模擬棧 佇列
二 陣列模擬佇列 用陣列模擬棧,可以幫助我們理解棧的本質。模擬棧的關鍵點就是 棧頂指標 這比鍊錶簡單多了,鍊錶需要知道頭尾 每個節點的前後指標,而棧只有乙個指標!隨著不斷地push和pop,棧頂指標會不斷向後移動,前面的空間就浪費了。這對於演算法題來說是可以忍受的,畢竟更看重時間效率。include...