Leetcode刷题106-35. 搜索插入位置(C++详细解法!!!)

Come from : [https://leetcode-cn.com/problems/search-insert-position/]

35. Search Insert Position

1.Question

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You may assume no duplicates in the array。

Example 1 :

Input: [1,3,5,6], 5
Output: 2

Example 2 :

Input: [1,3,5,6], 2
Output: 1

Example 3 :

Input: [1,3,5,6], 7
Output: 4

Example 4 :

Input: [1,3,5,6], 0
Output: 0

2.Answer

easy 类型题目。两种方法解答: 暴力法二分查找法
我的方法:(1. 暴力法)
AC代码如下:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int res = 0;
        if(nums[0] > target) return 0;
        if(nums[nums.size()-1] < target) return nums.size();
        for(int i = 0; i < nums.size(); ++i)//第一轮:查找target是否在nums中
        {
            if(target == nums[i])
            {
                res = i;
            }
        }
        for(int i = 0; i < nums.size() - 1; ++i)//第二轮:若没有在nums中,记住下标
        {
            if(target > nums[i] && target < nums[i+1])
            {
                res = i+1;
            }
        }
        return res;
    }
};

我的方法:(2. 标准二分查找法)
AC代码如下:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int index = -1;
        int begin = 0;   //搜索区 左端点
        int end = nums.size() - 1;  //搜索区 右端点
        
        while(index == -1)  //若index为-1,说明还没有找到正确位置,持续二分搜索 
        {
            int mid = (begin + end)/2;    //计算中心位置
            if(target == nums[mid])       //若找到target
            {
                index = mid;
            }
            else if(target < nums[mid])
            {
                if( mid == 0 || target > nums[mid-1])
                {
                    index = mid;
                }
                end = mid - 1;    //更新左端点
            }
            else if(target > nums[mid])
            {
                if(mid ==  nums.size() -1 || target < nums[mid+1])
                {
                    index = mid + 1;
                }
                begin = mid + 1;   //更新右端点
            }
        }
        return index;
    }
};

3.大神解答

速度排名第一(0秒 过分了啊)。

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        if (nums.empty())
        {
            return 0;
        }

        int min = 0;
        int max = nums.size() - 1;

        while (min < max)
        {
            int mid = (max - min) / 2 + min;

            if (nums[mid] == target)
            {
                break;
            }

            if (nums[mid] > target)
            {
                max = mid - 1;
            }

            if (nums[mid] < target)
            {
                min = mid + 1;
            }

        }

        int mid = (max - min) / 2 + min;
        if (nums[mid] == target || nums[mid] > target)
        {
            return mid;
        }
        else
        {
            return mid += 1;
        }
    }
};

4.我的收获

二分查找。
fighting。。。

2019/6/24 胡云层 于南京 106

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/93526682