加上給定乙個陣列和值x。設計乙個演算法使得如果陣列中存在兩個元素的和為x,則輸出兩個元素的值組成的陣列(不區分先後),否則輸出。
分析:
最簡單的辦法,就是依次求每個元素與其他元素的和。這個就是經典的握手問題,不難得出其最壞時間複雜度為: \(\theta\)(\(n^2\)) 這種指數級別的時間複雜度必然不是我們想要的,直接pass
先做排序然後再進行查詢: 假設使用前面已知的最快的排序演算法,最壞時間複雜度為: \(\theta\)(nlg(n))。之後可以使用二分查詢法對每個針對每個元素查詢 x - arr[i] 是否在陣列中,此時時間最壞時間複雜度為: \(\theta\)(nlg(n))。該演算法實現的**如下:
private static int findsum(int arr, int sum)
// step2: 開始判斷sum-arr[i]是否在map中
for (int i = 0; i < arr.length; i++) ;}}
return new int;
}
private static int findsumtwoside(int arr, int sum) ;
} else if (arr[lowindex] + arr[upindex] < sum) else
}return new int ;
}
其解決思想就是分治了。將n個元素的規模依次降低,最終降到2個元素的和。這裡給出三個元素求和的例子,其他多維依次類推:
private static int findsumof3digits(int arr, int sum)
// 複製arr[i]右側元素到陣列結尾位置
if (i < arr.length - 1)
// 如果剩下兩個數的和滿足,則返回三個元素
int leftindexes = findsumtwoside(leftarr, sum - arr[i]);
if (!arrays.equals(leftindexes, new int )) ;}}
return new int ;
}
黎明前最黑暗,成功前最絕望! 最大子陣列的和問題 線性演算法
計算給定陣列的最大子陣列的和有很多種演算法,最常見的是使用分治的策略,然而此問題用分治卻增加了時間複雜度和 複雜度。有更簡單的演算法,本文就將介紹乙個線性時間的迭代演算法。這應該是最高效的解決方法了。首先 如下 int maxsubarray int array,int length return ...
資料結構和演算法之稀疏陣列
五子棋程式,只有兩種顏色的子,連成五個就gameover。可能乙個棋盤能放下100枚棋子,但是總占用空間只有不到10個,遊戲就over了。那麼這樣儲存到本地file的話,空間是極大的浪費的。這就引出了稀疏陣列。當乙個陣列中大部分元素都是0 或是同乙個值 的時候,就可以用稀疏陣列來儲存此陣列。先有個原...
陣列問題之七
自然數陣列的排序 奇數下標都是奇數或者偶數下標都是偶數 子陣列的最大累加和問題 在陣列中找到乙個區域性最小的位置 陣列中子陣列的最大累乘積 陣列小和定義如下 陣列s 1,3,5,2,4,6 在s 0 的左邊小於等於s 0 的數的和為0,在s 1 的左邊小於或等於s 1 的數的和為1,在s 2 的左邊...