LeetCode #34. 在排序数组中查找元素的第一个和最后一个位置

LeetCode #34. 在排序数组中查找元素的第一个和最后一个位置

    • I. Description:
    • II. Solution:
      • Version 1
          • 解题思路:
          • Code:
      • Version 2
          • 解题思路:
          • Code:

I. Description:

LeetCode #34. 在排序数组中查找元素的第一个和最后一个位置_第1张图片

II. Solution:


Version 1


解题思路:

  本题思路不算难,首先想到的是利用find_if()的思路,查找到有序数组中所有目标值的索引,然后取首和尾。利用STL中的find()函数,先查找到第一个值的位置赋给某个迭代器 i t r itr itr,然后不断让 i t r itr itr 自增1,直到找不到对应的目标值。

Code:
  • cpp
#include 
#include 

using namespace std;

class Solution {
     
public:
    vector<int> searchRange(vector<int>& nums, int target) {
     
        vector<int>::iterator start = nums.begin();
        vector<int>::iterator end, itr;
        vector<int> tmp;
        int L = nums.size();

        while((itr = find(start, nums.end(), target)) != nums.end())
        {
     
            tmp.push_back(distance(nums.begin(), itr));
            ++start;
        }

        if(tmp.empty()){
     
            vector<int> res(2, -1);
            return res;
        }
        else{
     
            vector<int> res;
            res.push_back(tmp[0]);
            res.push_back(tmp[tmp.size() - 1]);

            return res;
        }

    }
};

Version 2


解题思路:

  稍微换了下思路,若目标值存在,先查到第一个元素的位置,然后利用STL中的count()计算得到数组中目标值的个数 n u m b e r number number,然后根据 n u m b e r number number是否大于1分开处理,等于1则首位索引一样。ps: distance()函数用于计算两个迭代器之间包含的元素个数,定义在< i t e r a t o r iterator iterator>头文件中, 并位于 std 命名空间中。

Code:
  • cpp
#include 
#include 

using namespace std;

class Solution {
     
public:
    vector<int> searchRange(vector<int>& nums, int target) {
     
        vector<int> res;
        vector<int> Nofound = {
     -1, -1};
        int start, end, number;
        
        //查找目标是否存在
        vector<int>::iterator itr;
        itr = find(nums.begin(), nums.end(), target);
        start = distance(nums.begin(), itr);

        if(itr != nums.end())
        {
     
            //若存在,则start便为第一个元素的索引
            res.push_back(start);
            //然后根据目标值存在是否大于1个分情况处理
            number = count(nums.begin(), nums.end(), target);
            if(number > 1){
     
                end = start + number - 1;
                res.push_back(end);
            }
            else{
     
                //开始和结束是同一个位置
                res.push_back(start); 
            }

            return res;
        }
        else
        {
     
            return Nofound;
        }

    }
};

你可能感兴趣的:(LeetCode)