leetcode演算法專題訓練 七 查詢專題

2021-10-18 05:11:26 字數 4311 閱讀 7132

33. 搜尋旋轉排序陣列

題目描述:公升序排列的整數陣列 nums 在預先未知的某個點上進行了旋轉(例如, [0,1,2,4,5,6,7] 經旋轉後可能變為 [4,5,6,7,0,1,2] )。

請你在陣列中搜尋 target ,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

每乙個數都是獨一無二的。

解題思路:二分法,先判斷nums[mid]是否等待target,再根據最左邊和最右邊的兩個遞增區間判斷二分。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

else

//落在右遞增區間

}return-1

;}};

81. 搜尋旋轉排序陣列 ii

題目描述:假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。

編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。

可能會有相同的數。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

else

//落在右遞增區間

}return

false;}

};

153. 尋找旋轉排序陣列中的最小值

題目描述:假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] 。

請找出其中最小的元素。

nums 中的所有整數都是 唯一 的。

解題思路:二分法,每一次先判斷nums[mid]處於左邊的遞增區間還是右邊的遞增區間。若處在左邊的遞增區間,取最小值後右移;若處在右邊的遞增區間,取最小值後左移。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

else

//mid在右邊遞增區間

}return ans;}}

;

154. 尋找旋轉排序陣列中的最小值 ii

題目描述:假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

注意陣列中可能存在重複的元素。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

else

if(nums[mid]

> nums[l]

)//mid在左邊遞增區間

else

//mid在右邊遞增區間

}return ans;}}

;

34. 在排序陣列中查詢元素的第乙個和最後乙個位置

題目描述:

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。

如果陣列中不存在目標值 target,返回 [-1, -1]。

高階:你可以設計並實現時間複雜度為 o(log n) 的演算法解決此問題嗎?

解題思路:本題可以通過實現 lower_bound 和 upper_bound函式來實現,也就是用二分法求開始位置和結束位置。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

return l;

}int

upper_bound

(vector<

int>

& nums,

int target)

return l -1;

} vector<

int>

searchrange

(vector<

int>

& nums,

int target)

;return vector<

int>;}

};

劍指 offer 53 - ii. 0~n-1中缺失的數字

題目描述:在範圍0~n-1內的n個數字中有且只有乙個數字不在該陣列中,請找出這個數字。該陣列從0開始遞增。

示例 1:

輸入: [0,1,3]

輸出: 2

示例 2:

輸入: [0,1,2,3,4,5,6,7,9]

輸出: 8

解題思路:遞增陣列,二分查詢,充分利用陣列有序,下標與元素對應這兩個條件。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

return l;}}

;

35.搜尋插入位置

題目描述:給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。

你可以假設陣列中無重複元素。

解題思路:用二分法可以找到該目標值下標,或者說是插入的順序。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

return l;}}

;

4.尋找兩個正序陣列的中位數

題目描述:給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。

要求:你能設計乙個時間複雜度為 o(log (m+n)) 的演算法解決此問題嗎?

解題思路:該題用雙指標法求解,不斷從雙指標中較小的數往後推進,並且中位數k不斷二分減小,這樣可以讓雙指標快速往後推進,達到二分效果。

時間複雜度:o(log(m+n))

空間複雜度:o(1)

class

solution

else

}return0;

}double

findmediansortedarrays

(vector<

int>

& nums1, vector<

int>

& nums2)

};

劍指 offer 41. 資料流中的中位數

題目描述:如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。

例如,[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計乙個支援以下兩種操作的資料結構:

void addnum(int num) - 從資料流中新增乙個整數到資料結構中。

double findmedian() - 返回目前所有元素的中位數。

解題思路:用vector陣列儲存新增進行來的元素,保證陣列是有序儲存的,在插入元素的時候就會進行插入排序。

時間複雜度:addnum:o(n), findmedian : o(1)

空間複雜度: o(n)

class

medianfinder

void

addnum

(int num)

}double

findmedian()

};

解題思路:設定兩個堆,左邊為最大堆,右邊為最小堆,且保證右邊的堆始終比左邊的堆大;這也就是說,如果要加入乙個數,得先進左邊堆,再進右邊的堆。

時間複雜度:addnum:o(logn) findmedian:o(1)

空間複雜度:o(n)

class

medianfinder

void

addnum

(int num)

}double

findmedian()

};

leetcode演算法專題訓練 十四 位操作專題

50.pow x,n 題目描述 實現 pow x,n 即計算 x 的 n 次冪函式。100.0 x 100.0 n 是 32 位有符號整數,其數值範圍是 2 31,2 31 1 解題思路 基於二進位制的快速冪運算,x n 求解,將 n 轉化為二進位制數,不斷在二進位制數的n末尾判斷是1還是0,是1的...

leetcode專題訓練 滑動視窗

1 76.最小覆蓋子串 給你乙個字串 s 乙個字串 t 返回 s 中涵蓋 t 所有字元的最小子串。如果 s 中不存在涵蓋 t 所有字元的子串,則返回空字串 注意 如果 s 中存在這樣的子串,我們保證它是唯一的答案。解答 滑動視窗就是用一左一右兩個指標來做。右指標移動,一旦滿足條件,則判斷當前長度是不...

leetcode演算法專題訓練 四 棧與佇列專題

劍指 offer 09.用兩個棧實現佇列 解題思路 設定兩個佇列,左邊的佇列用來入隊,右邊的佇列用來出隊。時間複雜度 o 1 空間複雜度 o 1 class cqueue void int value intdeletehead int val stk2.top stk2.pop return va...