算法-二分运算

📅 发布时间:2026/7/23 14:29:31
算法-二分运算 二分分为整数二分和浮点二分在整数二分中需要特别注意边界的细节整数二分-求边界pairint, int binary_search(const vectorint num, int target){if (num.empty())return { -1,-1 };pairint, intans { -1,-1 };int left 0;int right num.size() - 1;while (left right){int mid (left right) 1;if (num[mid] target)right mid;elseleft mid 1;}if (num[left] ! target)return { -1,-1 };ans.first left;left 0;right num.size() - 1;while (left right){int mid (left right 1) 1;if (num[mid] target)left mid;elseright mid - 1;}ans.second left;return ans;}需要特别注意①边界条件是left right如果取等会有特别条件报错②在数列单调递增的时候左边界应是num[mid] target但是如果是递减就要变成≤③mid计算的时候是否加一取决于right是等于mid还是不动如果不动则需要加一或者理解为left等于mid的时候需要加一如果元素至多一个便会简单很多int binary_search(const vectorint num, int target){int left 0;int right num.size() - 1;while (left right){int mid (left right) 1;if (num[mid] target)right mid - 1;else if (num[mid] target)return mid;elseleft mid 1;}return -1;}此时条件直接left right即可浮点二分double binary_search(double left, double right){double gap 1e-6;while (right - left gap){double mid (left right) / 2;if (check(left))left mid;elseright mid;}return left;}具体例子求平方根double binary_search(double num){if (num 0)return -1;double gap 1e-6;double left 0;double right max(1.0, num);while (right - left gap){double mid (left right) / 2;if (mid * mid num)right mid;elseleft mid;}return left;}值得注意gap的取值应该小于题目要求答案精度的1%