二分查詢也稱折半查詢(bi
nary
sear
ch
)(binary \;search)
(binar
ysea
rch)
,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。
第一次寫部落格,之所以選這個演算法是因為第一次面試問了這個題,自己學習的時候也沒認真看,結果出現了一些問題,所有在這裡總結一下。
leetcode 35. 搜尋插入位置
你可以假設陣列中無重複元素。
在面試前,我遇到二分查詢是直接用遞迴來寫的,結果面試的時候面試官直接說別用遞迴,因為遞迴比較耗資源(函式棧)。但我還是先把遞迴解法寫一下。
class
solution
private
intsearchinserthepler
(int
nums,
int target,
int start,
int end)
mid =
(start + end)/2
;if(target > nums[mid]
)return
searchinserthepler
(nums, target, mid +
1, end)
;return
searchinserthepler
(nums, target, start, mid);}
}
遞迴解法時間複雜度o(l
ogn)
o(logn)
o(logn
),空間複雜度o(l
ogn)
o(logn)
o(logn
)。其實上述用的是尾遞迴(也是面試的時候才知道的),因此經過編譯器優化後空間複雜度也是o(1
)o(1)
o(1)
,但還是推薦用下面的迭代解法。
迭代解法可以將空間複雜度降到o(1
)o(1)
o(1)
class
solution
return i;
}}
給定乙個按照公升序排列的整數陣列 num
snums
nums
,和乙個目標值 tar
ge
ttarget
target
。找出給定目標值在陣列中的開始位置和結束位置。
你的演算法時間複雜度必須是o(l
ogn)
o(logn)
o(logn
) 級別。
如果陣列中不存在目標值,返回 [−1
,−1]
[-1, -1]
[−1,−1
]。
class
solution
; answer =
newint[2
];answer[0]
=getminindex
(nums, target);if
(answer[0]
==-1)
else
return answer;
}private
intgetminindex
(int
nums,
int target)
else
}return nums[i]
== target ? i :-1
;}private
intgetmaxindex
(int
nums,
int target)
else
}return i;
}}
這道題用了兩次二分查詢分別找出了陣列中 tar
ge
ttarget
target
第一次和最後一次出現的位置,兩個函式中不同的乙個地方是用了
mid =
(i + j)/2
;
和
mid =
(i + j +1)
/2;
區別是什麼呢?當 [i,
j]
[i, j]
[i,j
] 的長度是奇數時,兩種寫法都是區最中間的那個數;不同的是當長度是偶數時,前者是取中間靠左的那個數,後者是取靠右的那個數。
編寫乙個高效的演算法來判斷 m×n
m\times n
m×n矩陣中,是否存在乙個目標值。該矩陣具有如下特性:
每行中的整數從左到右按公升序排列。
每行的第乙個整數大於前一行的最後乙個整數。
示例 1:
輸入:mat
rix=
[135
710
1116
2023
303450]
targ
et=3
matrix = \left[ \begin 1 & 3 & 5 & 7 \\ 10 & 11 &16&20 \\ 23&30&34&50\\ \end\right]\\target = 3
matrix
=⎣⎡
1102
331
130
5163
472
050
⎦⎤t
arge
t=3輸出: tru
etrue
true
class
solution
else
} k = i;
if(matrix[k][0
]== target)
return
true
; i =0;
j = n -1;
while
(j > i)
else
}return matrix[k]
[i]== target;
}}
兩次二分查詢,時間複雜度為 o(l
ogm+
logn
)=o(
log(
mn))
o(logm+logn)=o(log(mn))
o(logm
+log
n)=o
(log
(mn)
)
二分查詢總結
今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...
二分查詢總結
我們假設乙個最簡單的環境,對於數x,按要求詢問它在乙個陣列a 假設從小到大 裡的位置,陣列個數為n。1.查詢最後乙個小於x的數的位置 常見的一種要求。返回小於x的其中的最右邊乙個數的下標。int half int x return r 2.查詢最後乙個小於或等於x的數的位置 返回小於或等於x的其中的...
二分查詢總結
二分查詢其實並不簡單 這個演算法有很多版本 而且變化也比較多 稍一不留神就容易寫錯 這裡總結一下 一般二分查詢 binary serach int f int array,int key,int len else cout return 1 注意判斷條件必須要這麼寫 因為比如奇數個元素 1,3,5 ...