問題:
?給定一個排序數組和一個數k,要求找到第一個k的位置和最后一個k的位置
解析:
由于給定的數組是從小到大排序的,故可以按照二分查找法來找,下面分別從遞歸和循環兩種方法來闡述:
//遞歸方法
int GetFirstK(int* data, int length, int k, int start, int end)
{if (start > end)return -1;int middleindex = (start + end) / 2;int middledata = data[middleindex];if (middledata>k){end = middleindex - 1;}else if (middledata<k){start = middleindex + 1;}else{if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k))//判斷左邊的元素是否等于k,若等于,說明第一個k在左邊,否則第一個k就是middledata{return middleindex;}else{end = middleindex - 1;}}return GetFirstK(data, length, k,start, end);
}
//循環法
int GetFirstK(int* data, int length, int k)
{int start = 0;int end = length - 1;while (start<=end){int middleindex = (start + end) / 2;int middledata = data[middleindex];if (middledata<k){start = middleindex + 1;}else if (middleindex>k){end = middleindex - 1;}else{if (middleindex==0||(middleindex>0&&data[middleindex-1]!=k)){return middleindex;}else{end = middleindex - 1;}}}return -1;}
//遞歸法
int GetLastK(int* data, int length, int k, int start, int end)
{if (start>end){return -1;}int middleindex = (start + end) >> 1;int middledata = data[middleindex];if (middledata<k){start = middleindex + 1;}else if (middledata>k){end = middleindex - 1;}else{if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k)){return middleindex;}else{start = middleindex + 1;}}return GetLastK(data, length, k, start, end);
}
//循環法
int GetLastK(int* data, int length, int k)
{int start = 0;int end = length - 1;while (start<=end){int middleindex = (start + end) >> 1;int middledata = data[middleindex];if (middledata>k){end = middleindex - 1;}else if (middledata<k){start = middleindex + 1;}else{if (middleindex==length-1||(middleindex<length-1&&data[middleindex+1]!=k)){return middleindex;}else{start = middleindex + 1;}}}return -1;
}