為什么很多同事,下班后寧愿在工位刷抖音也不回家呢?
為什么很多同事,下班后寧愿在工位刷抖音也不回家呢?
你下班了,是立刻回家還是會再待一會?相信大家肯定都是馬上飛奔回家吧,再待一會干嘛,上班上出癮了嗎?然而,一網(wǎng)友就發(fā)帖提問:為什么公司那么多同事(尤其是Leader),晚上寧愿在工位刷抖音也不下班回家呢?
帖子下面,熱愛評論的寶子們?yōu)槲覀兘饣罅?。有人直接說:“據(jù)觀察,有的是不想回家?guī)『?,有的是單身狗不想回狹小的出租屋”
還有人說:“因?yàn)榛丶抑挥锌帐幨幍姆块g 在公司省電費(fèi)”區(qū)區(qū)幾個字,越看越心酸。
另一邊,還有人開玩笑:“等著家里老婆完事,不想回去撞到尷尬?!卑∵@...
更有人直言:“我之前問過我們公司一個領(lǐng)導(dǎo),他跟我說等我到了他那個年紀(jì),你就知道了”
這也反映出了一種生活狀態(tài):在外面各種當(dāng)牛馬,回家還要面對各種壓力,所以,不回家就成了最簡單的逃避方式。
但不管怎樣,生活還得繼續(xù),希望大家都能找到屬于自己的調(diào)味劑。畢竟,生活不止眼前的茍且,還有詩和遠(yuǎn)方,不是嗎?那么你們覺得又是為什么呢?
下面是今日的大廠算法題
今日算法題,來自LeetCode的第34題:在排序數(shù)組中查找元素的第一個和最后一個位置,下面是我的算法思路及實(shí)現(xiàn),讓我們來看看吧。
算法題目
給定一個按照升序排列的整數(shù)數(shù)組 nums 和一個目標(biāo)值 target,找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。
如果數(shù)組中不存在目標(biāo)值 target,返回 [-1, -1]。
你必須設(shè)計(jì)并實(shí)現(xiàn)時(shí)間復(fù)雜度為 O(log n) 的算法。
資源分享
算法思路
本題可以通過二分查找算法進(jìn)行兩次查找來解決:
-
第一次二分查找定位到目標(biāo)值的開始位置:
-
如果 mid 對應(yīng)的值大于或等于 target,移動右邊界 right 到 mid。
-
否則,移動左邊界 left 到 mid + 1。
-
最終,左邊界 left 將指向目標(biāo)值的開始位置。
-
第二次二分查找定位到目標(biāo)值的結(jié)束位置: -
如果 mid 對應(yīng)的值小于或等于 target,移動左邊界 left 到 mid + 1。
-
否則,移動右邊界 right 到 mid。
-
最終,右邊界 right 將指向目標(biāo)值的結(jié)束位置的下一個位置,所以目標(biāo)值的結(jié)束位置實(shí)際上是 right - 1。
在每次查找過程中,都需要檢查邊界條件,確保不會出現(xiàn)越界的情況。
func
searchRange
(nums []int, target int)
[]int {
findFirstPosition :=
func
()
int {
left
,
right
:=
0
, len(nums)-
1
for
left
<=
right
{
mid :=
left
+ (
right
-
left
)/
2
if
nums[mid] < target {
left
= mid +
1
}
else
{
right
= mid -
1
}
}
if
left
< len(nums) && nums[
left
] == target {
return
left
}
return
-
1
}
findLastPosition :=
func
()
int {
left
,
right
:=
0
, len(nums)-
1
for
left
<=
right
{
mid :=
left
+ (
right
-
left
)/
2
if
nums[mid] <= target {
left
= mid +
1
}
else
{
right
= mid -
1
}
}
if
right
>=
0
&& nums[
right
] == target {
return
right
}
return
-
1
}
return
[]int{findFirstPosition(), findLastPosition()}
}
Java實(shí)現(xiàn)
public
int[] searchRange(int[] nums, int target) {
int[] result = new int[]{-
1
, -
1
};
result[
0
] = findFirstPosition(nums, target);
result[
1
] = findLastPosition(nums, target);
return
result;
}
private
int findFirstPosition(int[] nums, int target) {
int
left
=
0
,
right
= nums.length -
1
;
while
(
left
<=
right
) {
int mid =
left
+ (
right
-
left
) /
2
;
if
(nums[mid] >= target) {
right
= mid -
1
;
}
else
{
left
= mid +
1
;
}
}
if
(
left
< nums.length && nums[
left
] == target)
return
left
;
return
-
1
;
}
private
int findLastPosition(int[] nums, int target) {
int
left
=
0
,
right
= nums.length -
1
;
while
(
left
<=
right
) {
int mid =
left
+ (
right
-
left
) /
2
;
if
(nums[mid] <= target) {
left
= mid +
1
;
}
else
{
right
= mid -
1
;
}
}
if
(
right
>=
0
&& nums[
right
] == target)
return
right
;
return
-
1
;
}
JavaScript實(shí)現(xiàn)
function searchRange(nums, target) {
function findFirstPosition() {
let
left
=
0
,
right
= nums.length -
1
;
while
(
left
<=
right
) {
let
mid =
Math
.floor((
left
+
right
) /
2
);
if
(nums[mid] >= target) {
right
= mid -
1
;
}
else
{
left
= mid +
1
;
}
}
if
(nums[
left
] === target)
return
left
;
return
-
1
;
}
function findLastPosition() {
let
left
=
0
,
right
= nums.length -
1
;
while
(
left
<=
right
) {
let
mid =
Math
.floor((
left
+
right
) /
2
);
if
(nums[mid] <= target) {
left
= mid +
1
;
}
else
{
right
= mid -
1
;
}
}
if
(nums[
right
] === target)
return
right
;
return
-
1
;
}
return
[findFirstPosition(), findLastPosition()];
}
算法解析
這種方法利用了二分查找的高效查找能力,在對數(shù)組進(jìn)行兩次二分查找后,能夠精確地找到目標(biāo)值的開始和結(jié)束位置。
通過調(diào)整左右邊界的移動策略,我們可以分別定位到目標(biāo)值的首次和最后一次出現(xiàn)的位置,從而實(shí)現(xiàn)了在 O(log n) 時(shí)間復(fù)雜度內(nèi)解決問題的目標(biāo)。
對于數(shù)組 nums = [5,7,7,8,8,10] 和目標(biāo)值 target = 8:
-
第一次查找定位到開始位置,結(jié)果為 3。
-
第二次查找定位到結(jié)束位置,結(jié)果為 4。
因此,函數(shù)返回 [3, 4]。
-
為什么很多企業(yè)明確不招外包? -
Pandas 教程-Pandas DataFrame.where() -
干掉 Postman?測試接口直接生成API文檔,這個文檔工具真香!
-
2023年各省最新電價(jià)一覽!8省中午執(zhí)行谷段電價(jià)! 2023-01-03
-
PPT導(dǎo)出高分辨率圖片的四種方法 2022-09-22
-
全國消防救援總隊(duì)主官及簡歷(2023.2) 2023-02-10
-
盤點(diǎn) l 中國石油大慶油田現(xiàn)任領(lǐng)導(dǎo)班子 2023-02-28
-
我們的前輩!歷屆全國工程勘察設(shè)計(jì)大師完整名單! 2022-11-18
-
關(guān)于某送變電公司“4·22”人身死亡事故的快報(bào) 2022-04-26
