33. 搜尋旋轉排序陣列
題目描述:公升序排列的整數陣列 nums 在預先未知的某個點上進行了旋轉(例如, [0,1,2,4,5,6,7] 經旋轉後可能變為 [4,5,6,7,0,1,2] )。解題思路:二分法,先判斷nums[mid]是否等待target,再根據最左邊和最右邊的兩個遞增區間判斷二分。請你在陣列中搜尋 target ,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。
每乙個數都是獨一無二的。
時間複雜度:o(logn)
空間複雜度:o(1)
class
solution
else
//落在右遞增區間
}return-1
;}};
81. 搜尋旋轉排序陣列 ii
題目描述:假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。時間複雜度:o(logn)( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。
編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。
可能會有相同的數。
空間複雜度:o(1)
class
solution
else
//落在右遞增區間
}return
false;}
};
153. 尋找旋轉排序陣列中的最小值
題目描述:假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] 。解題思路:二分法,每一次先判斷nums[mid]處於左邊的遞增區間還是右邊的遞增區間。若處在左邊的遞增區間,取最小值後右移;若處在右邊的遞增區間,取最小值後左移。請找出其中最小的元素。
nums 中的所有整數都是 唯一 的。
時間複雜度:o(logn)
空間複雜度:o(1)
class
solution
else
//mid在右邊遞增區間
}return ans;}}
;
154. 尋找旋轉排序陣列中的最小值 ii
題目描述:假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。時間複雜度:o(logn)( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
請找出其中最小的元素。
注意陣列中可能存在重複的元素。
空間複雜度:o(1)
class
solution
else
if(nums[mid]
> nums[l]
)//mid在左邊遞增區間
else
//mid在右邊遞增區間
}return ans;}}
;
34. 在排序陣列中查詢元素的第乙個和最後乙個位置
題目描述:解題思路:本題可以通過實現 lower_bound 和 upper_bound函式來實現,也就是用二分法求開始位置和結束位置。給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。
如果陣列中不存在目標值 target,返回 [-1, -1]。
高階:你可以設計並實現時間複雜度為 o(log n) 的演算法解決此問題嗎?
時間複雜度: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。請你找出並返回這兩個正序陣列的中位數。解題思路:該題用雙指標法求解,不斷從雙指標中較小的數往後推進,並且中位數k不斷二分減小,這樣可以讓雙指標快速往後推進,達到二分效果。要求:你能設計乙個時間複雜度為 o(log (m+n)) 的演算法解決此問題嗎?
時間複雜度:o(log(m+n))
空間複雜度:o(1)
class
solution
else
}return0;
}double
findmediansortedarrays
(vector<
int>
& nums1, vector<
int>
& nums2)
};
劍指 offer 41. 資料流中的中位數
題目描述:如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。解題思路:用vector陣列儲存新增進行來的元素,保證陣列是有序儲存的,在插入元素的時候就會進行插入排序。例如,[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計乙個支援以下兩種操作的資料結構:
void addnum(int num) - 從資料流中新增乙個整數到資料結構中。
double findmedian() - 返回目前所有元素的中位數。
時間複雜度: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...