已排序的整數數組相關查找返回索引問題

對於數組的應用大家一定不會陌生,今天要介紹的就是兩種有關數組中對於指定元素的查找問題.

1、給定一個排序的整數數組,找到給定目標值的起始位置和結束位置。

題目要求:

  • 算法的運行時複雜度必須是O(log n)的順序。
  • 如果在數組中找不到目標,返回[-1,-1 ]。

示例:

  • 輸入數組a[ ]={1,2,3,3,4,4,5};target=3;
  • 返回結果{2,3};

解題思路:
(1)定義左右指針left和right:left=0;right=n-1;
(2)當left小於right的時候,採用二分查找的方法查找指定數據,如果找到了就將left和right存起來,沒找到就返回{-1,-1};

代碼實現:

 vector<int> searchRange(int A[], int n, int target) {
    int left=0;
    int right=n-1;
    vector<int> res;
    res.push_back(-1);
    res.push_back(-1);

    while(left<=right)
    {
        //找到了就將下標存起來
        if(A[left]==target&&A[right]==target)
        {
            res[0]=left;
            res[1]=right;
            break;
        }
        else
        {//二分查找遍歷數組
            int mid=left+((right-left)>>1);
            if(A[mid]<target)
                left=mid+1;
            else if(A[mid]>target)
                right=mid-1;
            else{
                if(A[right]==target)
                    ++left;
                else
                    --right;
            }
        }
      }
    return res;
 }

2、給定一個排序數組和一個目標值,如果在數組中找到目標值則返回索引。如果沒有,返回到它將會被按順序插入的位置。

示例:
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
解題思路:
遍歷給定數組中的數直到找到不小於target的數爲止,當前位置就是要返回的位置(如果與target相等符合題意就是該位置,如果大於target,那麼該數字以及該數字之後的向後移一位並將target插入該位置)
代碼實現:
這裏採用二分查找的方法查找指定數據target,有利於降低時間複雜度

 int searchInsert(int A[], int n, int target) {
    int left=0;
    int right=n-1;
    if(n==0)
        return 0;
    while(left<right)//查找元素
    {
        int mid=left+((right-left)>>1);
        if(target<A[mid])
            right=mid-1;
        else if(target>A[mid])
            left=mid+1;
        else
        {
            return mid;
        }
    }//此時沒有找到,就需要將要插入的元素與左元素比較
    if(A[left]>=target)
        return left;
    else
        return left+1;
}
發佈了115 篇原創文章 · 獲贊 74 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章