有序的数组中找到某一目标值首次出现的下标

来源:互联网 发布:淘宝农村服务站加盟 编辑:程序博客网 时间:2024/05/16 23:51

给定一个升序的数组,这个数组中可能含有相同的元素,并且给定一个目标值。要求找出目标值在数组中首次出现的下标。
思想:题目给出有序数组,应该想到利用二分查找来做。找到左邻居,使其值加一。利用二分查找,算法复杂度为O(logn)

#include<iostream>using namespace std;int findsearch(int *p, int length, int target){    int left = 0;    int right = length-1 ;    if (p[right - 1] < target&&length<0&&p==NULL)        return - 1;    while (left < right)    {        int mid = (left + right) / 2;        if (p[mid] < target)            left = mid + 1;        else            right = mid;    }    if (p[left] == target)        return left;    else        return -1;}int main(){    int p[] = { 4,6,6,6,6 };    int length = 5;    int target =6;    int index = findsearch(p, length, target);    cout << index << endl;}

类似题目:
找到有序数组中某一目标值在数组中的开始下标以及终止下标以及目标值出现的次数。也可以用下面的方法:

#include <iostream>using namespace std;//查找指定数字在有序数组中出现的次数,isLeft标记最左和最右int FindCntofNum(int a[], int len, int num, bool isLeft){    int left = 0, right = len - 1;    int pos, mid;    while (left <= right)//二分查找    {        mid = (left + right) / 2;        if (a[mid] < num)        {            left = mid + 1;        }        else if (a[mid] > num)        {            right = mid - 1;        }        else        {            pos = mid;            if (isLeft)//查找最左值            {                right = mid - 1;            }            else//查找最右值            {                left = mid + 1;            }        }    }    return pos;//返回最终查找到的位置}int main(){    int a[7] = { 1, 2, 3, 4, 4, 5 ,6};    int left, right, dst;    left = FindCntofNum(a, 7, 4, true);    right = FindCntofNum(a, 7, 4, false);    dst = right - left + 1;    cout<< dst<<endl;    return 0;}
阅读全文
0 0
原创粉丝点击