C++ 之LeetCode刷题记录(八)

😄😊😆😃😄😊😆😃

开始cpp刷题之旅,多学多练,尽力而为。

先易后难,先刷简单的。

35. 搜索插入位置

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5

输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2

输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7

输出: 4

解法:暴力法(O(n))

因为数组是有序数组,所以使用暴力法是很简单的。

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {     
        int res=0;   
        for(int i=0;i<nums.size();i++){
            if(target<= nums[i]){
                return i;
            }
        }
        return nums.size();
    }
};

提交记录如下所示:

暴力法都能击败这么多用户,估计不少老哥是使用暴力法之类的提交的。

😆😆😆😆

思路简单,代码简单,但是不符合题目O(log n) 的需求。

解法:二分查找法O(log n)

二分查找也很好理解,代码如下

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {        
        int left = 0;
        int right = nums.size() - 1;
        if (target <= nums[0]) {
            return 0;
        }
        if (target > nums[nums.size()-1]) {
            return nums.size();
        }
        int res=0;
        int middle = 0;
        while (right >left) {
            int length = right - left;
            middle = length % 2 == 0 ? length / 2 : (length + 1) / 2;
            middle += left;
            if (right - left <= 1) {
                res = right;
                break;           
            }
            else if (target > nums[middle]) {
                left = middle;
            }
            else if(target <= nums[middle]){
                right = middle;
            }
        }
        return res;
    }
};

提交记录如下所示:

思路:设置左右两个指针,将target值与中间值作比较,小于中间值说明靠近左边,就把右指针指向中间位置。否则就靠近右边,把左指针指向中间值。这样每次可以缩小一半的查找范围。

在数据量大的时候,会比循环查找快很多。

相关推荐
PAK向日葵2 小时前
【C++】整数类型(Integer Types)避雷指南与正确使用姿势
c++·安全·面试
lntu_ling2 小时前
Python-基于Haversine公式计算两点距离
开发语言·python·gis算法
ShineWinsu8 小时前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
小付同学呀8 小时前
C语言学习(五)——输入/输出
c语言·开发语言·学习
梦幻精灵_cq8 小时前
学C之路:不可或缺的main()主函数框架(Learn-C 1st)
c语言·开发语言
消失的旧时光-19439 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
iAkuya9 小时前
(leetcode)力扣100 76数据流的中位数(堆)
算法·leetcode·职场和发展
福大大架构师每日一题10 小时前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
抓饼先生10 小时前
iceoryx编译和验证
linux·c++·零拷贝·iceoryx
王老师青少年编程10 小时前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组