当前位置: 首页 > article >正文

Leetcode——数组:二分搜索法704.二分查找相似题目

知识点:

二分搜索的区间,一般分为左闭右闭或左闭右开

left=0
易错点1
while(易错点2)
{
    middle=(left+right)/2
    if(nums[middle]>target)
    {
        right=易错点3
    }
    else if(nums[middle]<target)
    {
        left=middle+1
    }
    else if(nums[middle]=target)
    {
        return target
    }
}
return -1

易错点:

1、定义right时是否-1

1、while循环条件,left是<还是<=right

2、当更新右区间时,right等于middle还是middle-1

1、左闭右闭

(1)right=numsize-1

定义时,将右侧减去,右边界left代表的为真实数据,因此右侧为闭区间

(2)while(left<=right)

右侧为闭区间,nums[left]为数组中的数据,也需要被比较,因此应该包括到循环条件中

(3)right=middle-1

if判断nums[middle]是否大于target时,nums[right]为准确的右边界。重新定义区间时,新区间应该为除去nums[middle]以后,左侧的全部数,因此应该-1

2、左闭右开

(1)right=numsize

右侧不-1,最右侧为一个虚值,不是实际数组中的数据

(2)while(left<right)

最右侧为虚值,如果使用等于,则会少比较最右侧的数字

(2)right=middle

当判断后,接下来的搜索区间多包含nums[right],因此不-1

nums[right]是否为准确值右边界right=while判断条件右边界重定义right=
准确值numsize-1left<=rightmiddle-1
不准确numsizeleft<rightmiddle

例题:704:二分查找

题目

(1)nums[right]不是准确值

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

(2)nums[right]是准确值

class Solution {
public:
    int search(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)
            {
                left=middle+1;
            }
            else if(nums[middle]==target)
            {
                return middle;
            }
        }
        return -1;
    }
};

vector的基础知识

vector分为容量和使用量,用size()返回向量的使用量,用capacity返回向量的容量

不可以使用sizeof计算长度

相似题目 :2529:正整数和负整数的最大计算

题目

https://leetcode.cn/problems/maximum-count-of-positive-integer-and-negative-integer/

 

题解

class Solution {
public:
    int maximumCount(vector<int>& nums) {
        int pos=0;  //正整数数目
        int neg=0;  //负整数数目
        int numsize=nums.size();
        int i=0;
        while(i<numsize)
        {
            if(nums[i]<0)
            {
                neg++;
            }
            else if(nums[i]>0)
            {
                pos++;
            }
            i++;
        }
        if(neg>=pos)
        {
            return neg;
        }
        else
        {
            return pos;
        }
    }
};

相似题目:1351:统计有序矩阵中的负数

题目

题解

class Solution {
public:
    int countNegatives(vector<vector<int>>& grid) {
        int i=0;
        int j=0;
        int num=0;
        int length=grid.size();
        int width=grid[0].size();
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<width;j++)
            {
                if(grid[i][j]<0)
                {
                    num++;
                }
            }
        }
        return num;
    }
};

矩阵vector

二维矩阵时,.size()得到的是行数


http://www.kler.cn/news/336079.html

相关文章:

  • 自动驾驶-问题笔记-待解决
  • Final Glory推出“荣耀勋章-神龙”,推动游戏叙事范式发展
  • 微信小程序处理交易投诉管理,支持多小程序
  • 【并发】ThreadLocalMap 解决 Hash 冲突的实现方式
  • 使用百度文心智能体创建多风格表情包设计助手
  • mmdetection实战,训练自己的数据集
  • ROS中显示标记教程
  • [C语言]指针和数组
  • 分层解耦-01.三层架构
  • 事件抽取(Event Extraction, EE)
  • Ajax和axios简单用法
  • Spring Boot:医院管理的数字化转型
  • 【Python】PDFMiner.six:高效处理PDF文档的Python工具
  • 【redis-05】redis保证和mysql数据一致性
  • 解决Python使用Selenium 时遇到网页 <body> 划不动的问题
  • C语言 | Leetcode C语言题解之第457题环形数组是否存在循环
  • 排查和解决JVM OOM实战
  • 视频美颜SDK与直播美颜工具API的架构设计与实现
  • IDEA中配置启动类的Active Profiles
  • 网络资源模板--Android Studio 停车场管理系统