代码随想录训练营Day56

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

今天是跟着代码随想录刷题的第56天,主要是复习了数组的内容,复习了数组的定义和二分法,做了一些二分法的扩展题目


提示:以下是本篇文章正文内容,下面案例可供参考

一、搜索插入位置

思路:这道题就是用二分法,具体应该返回哪个值,可以举个例子查看,在代码里面用的左开右闭还是左闭右开这个主要看后面right=middle还是middle-1,如果是左开右闭,就只能middle-1,因为最右边那个是闭的,所以不可能包括这个值,就要变成middle-1

代码:

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

代码如下(示例):

c 复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

二、在排序数组中查找元素的第一个和最后一个位置

思路:就是分查找元素位置的左边界和有边界,写两个函数一个求左边界一个求有边界

代码:

cpp 复制代码
class Solution {
 int getRightBorder(vector<int>& nums, int target) {
    int left=0;
    int right=nums.size()-1;
    int result;
    while(left<=right)
    {
        int middle=(left+right)/2;
        if(nums[middle]>target)
        {
            right=middle-1;
        }
        else if(nums[middle]==target)
        {
            while(middle<=nums.size()-1&&nums[middle]==target)
            {
                result=middle;
                middle++;
            }
            return result;
        }
        else
        {
            left=middle+1;
        }
    }
    return -1;

    }
     int getleftBorder(vector<int>& nums, int target) {
    int left=0;
    int right=nums.size()-1;
    int result;
    while(left<=right)
    {
        int middle=(left+right)/2;
        if(nums[middle]>target)
        {
            right=middle-1;
        }
        else if(nums[middle]==target)
        {
            while(middle>=0&&nums[middle]==target)
            {
                result=middle;
                middle--;
            }
            return result;
        }
        else
        {
            left=middle+1;
        }
    }
    return -1;

    }
public:
    vector<int> searchRange(vector<int>& nums, int target) {
    vector<int> result1;
    int a=getleftBorder(nums,target);
    int b=getRightBorder(nums,target);
    result1.push_back(a);
    result1.push_back(b);
    return result1;

   

    }
};

相关推荐
ShiinaMashirol42 分钟前
代码随想录打卡|Day27(合并区间、单调递增的数字、监控二叉树)
java·算法
wuqingshun3141593 小时前
蓝桥杯 5. 交换瓶子
数据结构·c++·算法·职场和发展·蓝桥杯
Demons_kirit3 小时前
Leetcode 2845 题解
算法·leetcode·职场和发展
adam_life3 小时前
http://noi.openjudge.cn/——2.5基本算法之搜索——200:Solitaire
算法·宽搜·布局唯一码
我想进大厂4 小时前
图论---朴素Prim(稠密图)
数据结构·c++·算法·图论
我想进大厂4 小时前
图论---Bellman-Ford算法
数据结构·c++·算法·图论
AIGC大时代4 小时前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
lkbhua莱克瓦244 小时前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
CODE_RabbitV5 小时前
【深度强化学习 DRL 快速实践】近端策略优化 (PPO)
算法
Wendy_robot5 小时前
【滑动窗口+哈希表/数组记录】Leetcode 438. 找到字符串中所有字母异位词
c++·算法·leetcode