LeetCode刷題總結 二分查詢

2021-09-12 18:00:44 字數 2211 閱讀 5027

leetcode 刷題總結(二分查詢)

二分主要是形成自己的**風格就可以了。常用兩種風格(現在偏向於風格一實現了):

leetcode35. 搜尋插入位置:

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

這個實際上就是手動實現lower_bound()函式(返回值為:在不破壞排序狀態的原則下,可插入value的第乙個位置)。

注:upper_bound()是返回可插入value的後乙個位置。

風格一:

class solution   

return left;

}};

風格二:

class solution   

return right;

}};

34. 在排序陣列中查詢元素的第乙個和最後乙個位置。這道題相比較lower_bound()就有一丟丟不同了。因為不存在的時候是要返回-1,而上面的是返回0。

class solution ;

return v;

}int left_bound(std::vector&nums,int target)

else if(nums[mid] < target)left = mid+1;

else right = mid-1;

}return -1;

}int right_bound(std::vector&nums,int target)

else if(nums[mid] < target)left = mid+1;

else right = mid-1;

}return -1;

}};

69. x 的平方根直接二分寫就寫了.

class solution 

return 0;

}};

還有一些假二維的:

74. 搜尋二維矩陣,這個是假二維了。

class solution 

return false;

}};

240. 搜尋二維矩陣 ii這個差不多二維,根據規律卡右上角。

class solution 

return false;

}};

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

class

solution

return

min(nums[l]

,nums[r]);

}};

還有一些看起來要有點變換的二分:

33. 搜尋旋轉排序陣列

畫圖很容易分析二分:

class solution 

else

}

return -1;

}};

81. 搜尋旋轉排序陣列 ii:

這個是上面的強化版,可以有重複數字了:1 3 3 3 3 3.旋轉之後有可能是3 1 3 3 3.這時候a[l]和a[mid]都是3了,所以二分的方向就沒了,就需要一步一步地走。上題中兩者相同是1 2旋轉成 2 1這種情況。沒影響。

class solution 

else if(nums[left] > nums[mid])

else left++;//相等的乙個乙個的走吧。

}

return false;

}};

來看道逼格高點的二分:

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

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設 nums1 和 nums2 不會同時為空。

這是個經典的top k 問題,求兩個有序陣列的第k個數是多少。

用到manacher構造奇數長度的辦法。

class solution 

return -1;

}};

LeetCode刷題記錄 第704題(二分查詢)

給定乙個 n 個元素有序的 公升序 整型陣列 nums 和乙個目標值 target 寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 1。示例 1 輸入 nums 1,0,3,5,9,12 target 9 輸出 4 解釋 9 出現在 nums 中並且下標為 4 示例 ...

關於二分查詢LeetCode刷題總結(上)

首先來談一下二分查詢的模板問題。一般會出現一下三種錯誤 1 陣列越界。2 死迴圈 3 跳過查詢的元素下標。先來看幾組常見容易出錯的模板。int low 0,high n while low這種情況下,如果在 2,2 中找值為3的下標,那麼每次都會讓low的值等於mid,使low和high緊挨在一起,...

leetcode刷題 演算法(4) 二分查詢

尋找乙個數 基本的二分搜尋 因為我們初始化 right nums.length 1 所以決定了我們的 搜尋區間 是 left,right 所以決定了 while left right 同時也決定了 left mid 1 和 right mid 1 因為我們只需找到乙個 target 的索引即可,所以...