zoukankan      html  css  js  c++  java
  • Leetcode No.35 Search Insert Position(c++实现)

    1. 题目

    1.1 英文题目

    Given a sorted array of distinct integers 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 must write an algorithm with O(log n) runtime complexity.

    1.2 中文题目

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    你可以假设数组中无重复元素。

    1.3输入输出

    输入 输出
    nums = [1,3,5,6], target = 5 2
    nums = [1,3,5,6], target = 2 1
    nums = [1,3,5,6], target = 7 4
    nums = [1,3,5,6], target = 0 0
    nums = [1], target = 0 0

    1.4 约束条件

    • 1 <= nums.length <= 104
    • -104 <= nums[i] <= 104
    • nums contains distinct values sorted in ascending order.
    • -104 <= target <= 104

    2. 实验平台

    IDE:VS2019
    IDE版本:16.10.1
    语言:c++11

    3. 程序

    3.1 测试程序

    #include "Solution.h"
    #include <vector>	// std::vector
    #include<iostream>	// std::cout
    using namespace std;
    
    // 主程序
    void main()
    {
    	// // 输入
    	vector<int> nums = { 1,3,5,6 };
    	int val = 4;
    
    	Solution solution; // 实例化Solution
    	int k = solution.searchInsert(nums, val); // 主功能
    
    	// 输出
    	cout << k << endl;
    }
    

    3.2 功能程序

    3.2.1 最佳程序

    (1)代码

    #pragma once
    #include<vector>    // std::vector
    using namespace std;
    
    //主功能(二分法+递归)
    class Solution 
    {
    public:
        int searchInsert(vector<int>& nums, int target)
        {
            int low = 0, high = nums.size()-1;
            while(low<=high)
            {
                int mid = low + (high - low)/2;
                if(target == nums[mid])
                    return mid;
                else if(target>nums[mid])
                    low = mid+1;                
                else
                    high = mid-1;
            }
            return low; 
        }
    };
    

    此程序参考:https://blog.csdn.net/lym940928/article/details/79893316

    (2)解读

    使用的是二分查找法,当while循环完成时,说明没有找到对应的数字,此时low > high,即low = high+1。因为数字树位于[low, hight+1]中的,也即位于[low,low]之中,因此返回low,即为target的最后的位置。

    3.2.2 自写程序

    (1)代码

    #pragma once
    #include<vector>    // std::vector
    using namespace std;
    
    //主功能(二分法+递归)
    class Solution 
    {
    public:
        int searchInsert(vector<int>& nums, int target)
        {
            if (target <= nums[0]) return 0; // 如果目标值比数组第一个元素还小,则返回0
            else
                return func(nums, target, 0, nums.size());  // 运行主要函数
        }
    
        int func(vector<int>& nums, int target, int left, int right)
        {
            int min = 0;
            if (right - left <= 1) return right;
            else
            {
                int mid = (left + right) / 2;
                if (nums[mid] > target)
                {
                    right = mid;
                    return func(nums, target, left, right); // 递归
                }
                else if (nums[mid] < target)
                {
                    left = mid;
                    return func(nums, target, left, right);
                }
                else
                    return mid;
            }
        }
    };
    

    (2)思路

    由约束条件一可知数组不为空数组,由约束条件三知数组里的元素是按照升序排列的,也就是说不用考虑降序排列的情况。另外由题目中要求时间复杂度为O(log n),可以联想到是用二分法进行求解,二分法的过程中还用到了递归的思想。

    4. 相关知识

    (1) 报错:error: non-void function does not return a value in all control paths

    这个错误在VS2019中没有报,但是在Leetcode那里却报错了,当时挺蒙蔽的,后来查找资料才知道,原来是自己我if...else if...else if...else...里前几个没有return,也就是说有些情况没有返回值,考虑不周全。
    这个可以参考:https://blog.csdn.net/pikaqiu123321123/article/details/114580378

    作者:云梦士
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    mysql数据库的备份和恢复
    安装docker17.06.0版本报错和解决方法
    mysql随笔系列-1
    22_redis哨兵主备切换的数据丢失问题:异步复制、集群脑裂
    21_redis哨兵架构的相关基础知识的讲解
    19_对项目的主从redis架构进行QPS压测以及水平扩容支撑更高QPS
    18_在项目中部署redis的读写分离架构(包含节点间认证口令)
    17_redis replication的完整流运行程和原理的再次深入剖析
    16_redis主从复制原理、断点续传、无磁盘化复制、过期key处理
    15_redis replication以及master持久化对主从架构的安全意义
  • 原文地址:https://www.cnblogs.com/yunmeng-shi/p/14932430.html
Copyright © 2011-2022 走看看