二分查找中的边界问题:+1,-1,<,<=
2017-03-20 16:22
302 查看
题目描述
统计一个数字在排序数组中出现的次数。
分析:
原来一直对二分法很模糊,对mid+1,还是mid,决定这两个差不多,今天自己打脸了,控制的不精准就是错误。
把边界确定更加准确点,[left,end]确定为闭区间,只要不在这个区间,就+1或者-1,不要模糊,不要模糊两可
统计一个数字在排序数组中出现的次数。
分析:
原来一直对二分法很模糊,对mid+1,还是mid,决定这两个差不多,今天自己打脸了,控制的不精准就是错误。
把边界确定更加准确点,[left,end]确定为闭区间,只要不在这个区间,就+1或者-1,不要模糊,不要模糊两可
class Solution { public: int GetNumberOfK(vector<int> data ,int k) { int right=data.size()-1; if (getLastk(data,k,0,right)==-1) return 0; return getLastk(data,k,0,right)-getFirstk(data,k,0,right)+1; } int getFirstk(vector<int>&data,int k,int left,int right){ while(left<=right){ int mid=(left+right)>>1; if(data[mid]<k) left=mid+1;//data[mid]!=k,所以k必然在[mid+1,right]之间,果断地+1,不要用left=mid;这里我们都用闭区间。 else if(data[mid]>k) right=mid-1; else if(mid-1>=0&&data[mid-1]==k) right=mid-1; else return mid; } return -1; } /* int getFirstk(vector<int>&data,int k,int left,int right){ if(left>right) return -1; int mid=(left+right)>>1; if(data[mid]<k) return getFirstk(data,k,mid+1,right); else if(data[mid]>k) return getFirstk(data,k,left,mid-1); else if(mid-1>=left&&data[mid-1]==k) return getFirstk(data,k,left,mid-1); else return mid; return -1; }*/ int getLastk(vector<int>&data,int k,int left,int right){ while(left<=right){ int mid=(left+right)>>1; if(data[mid]<k) left=mid+1; else if(data[mid]>k) right=mid-1; else if(mid+1<data.size()&&data[mid+1]==k) left=mid+1; else return mid; } return -1; } };
相关文章推荐
- 二分查找的边界问题
- 二分查找非递减序列的边界问题
- 二分查找的边界问题
- 二分查找引出的问题
- HDU 2199 || HDU 2899 (二分查找+数学问题)
- 二分查找要注意的问题
- 二分搜索/查找(最大化or最小化问题)
- 二分查找binsearch: 在v[0]&lt;=v[1]&lt;=v[2]&lt;=......&lt;=v[n-1]中查找x,数组v的元素必须以升序排列
- 03-1. 二分法求多项式单根(PAT) - 二分查找问题
- 九度OJ 1069 二分查找问题
- 关于二分查找的多个问题
- [经典面试题]二分查找问题汇总
- HDU 2199 || HDU 2899 (二分查找+数学问题)
- 二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现
- 一个可能存在Bug的二分查找方法的实现,大家一起看看有什么问题没
- 二分查找中的编程小问题
- HDU-2899(简单数学问题+二分查找)
- 二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现
- 查找问题整理(1)二分查找
- 旋转数组二分查找问题