雖然只是一道很簡單的題,但是也給我很多思考。
剛看到這道題的時候沒有仔細思考,直接寫了個排序和二分查詢,想著對每個數字查詢另乙個數字會不會出現,複雜度是o(n
logn
+nlo
gn
)o(nlogn+nlogn)
o(nlog
n+nl
ogn)
,主要訓練了一下自己手寫快速排序和二分查詢。
class
solution
void
getpovit
(vector<
int>
& a, vector<
int>
& b,
int l,
int r)
void
quicksort
(vector<
int>
& a,vector<
int>
& b,
int l,
int r)
quicksort
(a, b, l, j+1)
;quicksort
(a, b, j+
1, r);}
intbsearch
(vector<
int>
& a,
int l,
int r,
int x,
int now)
public
: vector<
int>
twosum
(vector<
int>
& nums,
int target)
quicksort
(nums, b,
0, n)
;// sort(nums.begin(), nums.end());
vector<
int> ret;
for(
int i=
0; i++i)
}return ret;}}
;
上面的做法很傻,稍微聰明一點的做法是排序以後從兩邊開始查詢。這樣的複雜度是o(n
logn
+n
)o(nlogn+n)
o(nlog
n+n)
的。因為我們求的是兩個數字的和,所以對於乙個排好序的陣列來講,如果乙個數字增大,另乙個數字一定減小。因此我們用兩個指標,乙個指向陣列的頭部,乙個指向陣列的尾部,如果出現所求的和就直接返回答案,如果兩個指標和比目標小就將前乙個指標後移,如果比目標大就把後乙個指標前移。這種直覺很容易證明是正確的。
class
solution
void
getpovit
(vector<
int>
& a, vector<
int>
& b,
int l,
int r)
void
quicksort
(vector<
int>
& a,vector<
int>
& b,
int l,
int r)
quicksort
(a, b, l, j+1)
;quicksort
(a, b, j+
1, r);}
intbsearch
(vector<
int>
& a,
int l,
int r,
int x,
int now)
public
: vector<
int>
twosum
(vector<
int>
& nums,
int target)
quicksort
(nums, b,
0, n)
;// sort(nums.begin(), nums.end());
int i =
0, j = n-1;
while
(i < j);if
(nums[i]
+ nums[j]
< target)
++i;
else
--j;
}return vector<
int>()
;}};
官方給出的題解是通過使用hashmap解決的,發現這樣的效率很好,然而我之前沒有接觸過hashmap,通過一番學習,用hashmap解決了一下。
class
solution;}
hashmap[nums[i]
]= i;
}return vector<
int>()
;}};
但是也沒有覺得快多少,可能是因為資料比較水看不出來差距吧。 1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 解class solution hash nums i...
1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 由於元素不能重複利用,所以使用j i 1,通過雙迴圈,...
1 兩數之和
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。public int twosum int nums,int target throw new illegalargumentexception no two sum solution 這樣的時間複雜度為0 nlogn 但是通過檢視官方的...