C++ 查找数值的位置

给定一个排序数组nums(无重复元素)与目标值target, 如果target在nums里出现,则返回target所在下标,如果target在nums里未出现,则返回target应该插入位置的数组下标,使得将target插入数组nums后,数组仍有序。

#include<vector>
class Solution
{
public:
 Solution() {}
 ~Solution() {}
 int searchInsert(std::vector<int> &nums, int target)
 {
  int Index = -1;
  int begin = 0;
  int end = nums.size()-1;
  while (Index==-1)
  {
   int mid = (begin + end) / 2;
   if (target==nums[mid])
   {
    Index=mid;
   }
   else if (target<nums[mid])
   {
    if (mid == 0 || target > nums[mid - 1])          
    //注意此处不能写为if ((target>nums[mid-1])||(mid==0))。因为先进行target>nums[mid-1]判断时,如果mid为0, mid-1就为-1
    //会造成subscript out range的错误,因此需要先判断mid是否为边界
    {
     Index = mid;
    }
    end = mid - 1;
   }
   else if (target>nums[mid])
   {
    if (mid == nums.size() - 1||target<nums[mid+1])       
    //注意此处不能写为if ((target<nums[mid+1])||(mid == nums.size() - 1))。因为先进行target<nums[mid+1]判断时,如果mid为nums.size()-1, mid+1就为nums.size()
    //会造成subscript out range的错误,因此需要先判断mid是否为边界
    {
     Index = mid + 1;
    }
    begin = mid + 1;
   }
  }
  return Index;
 }
};
int main()
{
 int test[] = {1,3,5,6};
 std::vector<int> nums;
 Solution solve;
 for ( int i = 0; i < 4; i++)
 {
  nums.push_back(test[i]);
 }
 for (int i = 0; i < 8; i++)
 {
  printf("i=%d     index=%d\n",i,solve.searchInsert(nums,i));
 }
 return 0;
}

运行结果为:

i=0     index=0
i=1     index=0
i=2     index=1
i=3     index=1
i=4     index=2
i=5     index=2
i=6     index=3
i=7     index=4
发布了79 篇原创文章 · 获赞 62 · 访问量 2210

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/104964425