给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1。
此题也就是求target在数组中第一次出现的位置。这里可能会有人想先直接用原始的二分查找,如果不存在直接返回-1,
如果存在,然后再顺序找到这个等于target值区间的最左位置,这样的话,最坏情况下的复杂度就是O(n)了,没有完全发挥出二分查找的优势。
这里的解法具体过程请参考实现代码与注释。
/********************************* * 日期:2015-01-05 * 作者:SJF0115 * 题目: 给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1 * 博客: **********************************/ #include <iostream> using namespace std; int BinarySearch(int A[],int n,int target){ if(n <= 0){ return -1; }//if int start = 0,end = n-1; // 二分查找变形 while(start < end){ int mid = (start + end) / 2; if(A[mid] < target){ start = mid + 1; }//if else{ end = mid; }//else }//while // 目标不存在的情况 // 此时start = end if(A[start] != target){ return -1; }//if else{ return start; } } int main(){ int A[] = {2,3,4,4,4,4,4,5,6,7,8}; cout<<BinarySearch(A,11,4)<<endl; return 0; }
[经典面试题]给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1
原文地址:http://blog.csdn.net/sunnyyoona/article/details/42406497