提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
今天是跟着代码随想录刷题的第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;
}
};