一种二分查找变形
2014-09-01 15:30
381 查看
原始的二分查找非常简单,只要找到值返回即可;但是如果某值在数组中是重复的,比如 1 3 5 5 5 5 10 11 20这样,要求找到第一个5和最后一个5,就需要对原始的二分查找进行一点变形。
代码如下:
非递归版
代码如下:
非递归版
int GetFirst_NonRecurse(int a[], int N, int k, int start, int end) { int mid; while (start <= end) { mid = start + (end-start)/2; if (a[mid] == k) { if (mid>0&&a[mid-1]!=k || mid==0) return mid; else end = mid - 1; } else if (a[mid] > k) end = mid - 1; else start = mid + 1; } return -1; } int GetLast_NonRecurse(int a[], int N, int k, int start, int end) { int mid; while (start <= end) { mid = start + (end - start)/2; if (a[mid] == k) { if (mid < N-1 && a[mid+1] != k || mid == N-1) return mid; else start = mid + 1; } else if (a[mid] > k) { start = mid + 1 ; } else { end = mid - 1; } } return -1; }递归版
int GetFirst(int a[], int N, int k, int start, int end) { if (start > end) return -1; int mid = start + (end-start)/2; if (a[mid] == k) { if (mid>0&&a[mid-1]!=k || mid==0) return mid; else end = mid - 1; } else if (a[mid] > k) end = mid - 1; else start = mid + 1; return GetFirst(a,N,k,start,end); } int GetLast(int a[], int N, int k, int start, int end) { if (start > end) return -1; int mid = start + (end - start)/2; if (a[mid] == k) { if (mid<N-1&&a[mid+1]!=k || mid==N-1) return mid; else start = mid + 1; } else if (a[mid] > k) { end = mid - 1; } else { start = mid + 1; } return GetLast(a,N,k,start,end); }
相关文章推荐
- 二分查找之变形
- Search a 2D Matrix,在有序矩阵查找,二分查找的变形; 行有序,列有序查找。
- 二分查找及其变形总结
- 【小米笔试题】二分查找算法的变形
- 二分查找变形1
- 2014-04-04 循环递增数组查找元素(二分变形思想,百度面试题)
- Find Minimum in Rotated Sorted Array I&&II——二分查找的变形
- 二分查找的一点变形
- 面试题_二分查找及其变形
- 折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
- 二分查找及变形
- 最长上升子序列变形题-二分查找DP
- 算法学堂 - 二分查找及其变形
- 51nod 1279 扔盘子 (二分查找的变形)
- 算法-分割有序数组后查值-二分查找的变形
- 二分查找及其变形整理
- leetcode旋转数组查找 二分查找的变形
- [二分查找变形]弯曲的木杆(POJ 1905)
- 二分查找 变形
- 微软的二分查找变形题