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 的索引即可,所以...