給你乙個有序整數陣列,陣列中的數可以是正數、負數、零,請實現乙個函式,這個函式返回乙個整數:返回這個陣列所有數的平方值中有多少種不同的取值。舉例:
nums = ,
那麼你應該返回的是:1。因為這個陣列所有數的平方取值都是1,只有一種取值。
nums =
你應該返回4,因為nums陣列所有元素的平方值一共4種取值:1,0,4,9
方法1 暴力破解
直接計算每個數字的平方,然後和其他數字的數字的平方進行對比,並進行統計。時間複雜度為o(n
2)
o(n^2)
o(n2)。
方法2 雜湊表
使用雜湊表,一遍遍歷且計算每個樹的平方存檔到雜湊表裡面,最終統計雜湊表中元素的個數。時間複雜度o(n
)o(n)
o(n)
, 空間複雜度是o(n
)o(n)
o(n)
。方法3 雙指標夾逼
類似快速排序雙指標夾逼,左右指標交替移動
時間複雜度為o(n
)o(n)
o(n)
,空間複雜度為o(1
)o(1)
o(1)
。由於陣列是有序的,絕對值相等的情況主要有兩種情況,臨近元素相等,左右指標互為相反數。演算法過程主要是分為三種情況:
#include #include using namespace std;
int main(int argc, char *ar**) ;
int res = 0;
int left = 0;
int right = arr.size()-1;
while(leftabs(arr[right]))
if(abs(arr[left])==abs(arr[right]))
} if(left==right) res++;
cout<}
序陣列中不同平方值的個數 頭條面試題
題目 求解乙個有序陣列不同平方值的個數,這裡平方值只有0,1兩種情況,返回2 這裡拼房族有0,1,4,9共4中情況,返回4。要求 時間複雜度o n 空間複雜度o 1 分析 有序陣列普遍是利用雙指標問題求解 其次,map 或雜湊 二分 跟指定target類似,這裡的target 0.每次檢查頭尾指標的...
面試題3 有序陣列合併
初階 合併兩個有序陣列a和b,使得結果依然有序。高階 合併兩個有序陣列a和b,假設a有n個數,b有m個數,a陣列後面還有m個空餘空間,需要將結果儲存在a中。答 一種解答當然是把兩個陣列放在一起重新排序了。這樣的時間複雜度是o nlogn 沒有用到陣列已經有序的條件,所以顯然不是乙個期望的解答。那麼既...
校招面試題二維有序陣列查詢
給定乙個二維整型矩陣,已知矩陣的每一行都按照從小到大的順序排列,每一列也都按照從小到大的順序排列。現在給出乙個數,請寫乙個函式返回該數是否存在於矩陣中。矩陣 現的數字與需要查詢的數 k 都為0 100000之間的整數,且矩陣的大小在3000 3000以內。在保證正確性的基礎上,請盡量給出比較高效的解...