Datawhale 12月组队学习 leetcode基础 day1 枚举

news2024/7/6 2:43:31

这是一个新的专栏,主要是一些算法的基础,对想要刷leedcode的同学会有一定的帮助,如果在算法学习中遇到了问题,也可以直接评论或者私信博主,一定倾囊相助


进入正题,今天咱们要说的枚举算法,这是个很简单的算法哈,先说一下原理然后就看几道题练一下,算是很好学的算法了

枚举算法

    • 枚举算法简介
    • 枚举算法解题思路
    • 例题
      • 例题1
      • 例题2
    • 练习

枚举算法简介

这里简单的和大家分享一下什么是枚举,简单来说,就是一一列举可能出现的情况,和我们要满足的目标状况进行比对,得到满足条件的解答,举个例子:目标状况是找出值>5的数,数的范围是[0,10]这时候我们是不是只需要写一个很简单的循环,遍历0到10这11个数就可以了

for(int i = 0 ; i <= 10 ; ++i)
{
	if(i>5)
	{
	printf("%d",i);
	}
}

因为这是一种很容易想到的思路,而且不容易出错,所以我们在做题想不出来很优秀的解法的时候,就可以考虑使用枚举的方法来做。

枚举算法解题思路

根据上面的例子,我们可以总结一下枚举算法的解题思路:
首先,确定枚举的范围,枚举的对象,判断条件。
其次遍历范围中的样例进行判断,看是否是问题的解。
最后,可以考虑优化枚举的范围,提高效率(主要就是时间复杂度)

例题

那么,根据枚举算法的解题思路,我们来做几道题,熟悉一下:

例题1

两数之和
在这里插入图片描述

这道题是一个非常简单的小题,只是让我们找出数组中两数之和等于目标值的数字组合的下标,并且只会有一个有效的答案,那么看第一个样例是[2,7,11,15] 目标值是9, 那么数字组合就是2,7 下标就是0,1。
那么用代码我们如何实现呢?
我们根据枚举的思路来分析,首先确定枚举的范围 那就是数组的大小了,枚举的目标就是数组里面的数字,目标条件就是数字组合相加等于目标值,
那么我们就可以写出以下遍历所有目标情况的代码:

    vector<int> twoSum(vector<int>& nums, int target) {
        int i = 0, j = 0;
        vector<int> res;
        //枚举答案 i外层循环j内层循环
        for(i = 0;i < nums.size();++i)
        {
            for(j = i+1;j<nums.size();++j)
            {
                if(nums[i]+nums[j] == target)
                {
                res.push_back(i);
                res.push_back(j);
                return res;
                }
            }
          
        }
        return res;
    }

nums是题里的已知条件 也是我们要遍历的数组,target就是目标值
在这里我们写了两层的for循环来解决这问题 第一个for循环是让i 从0开始一直遍历到数组末尾 j是从i的下一位开始(题目中不允许重复的数字组合)用枚举条件进行判断 如果符合条件 那么就把数组组合返回,达成题目要求,如果编程基础比较薄弱,或者感觉博主说的很模糊 那么可以看下面张图
在这里插入图片描述
下面再看一道题:

例题2

计算质数
在这里插入图片描述
这里先说一下什么是质数 质数就是除了1和本身以外,不能被其他的数整除的数字 就叫做质数 。
这题我们还是按照枚举的方法做,首先确定枚举范围,那就是从2开始一直到n的数(1不是质数),遍历的对象就是2到n的数字,判断条件就是这个数是不是质数 是质数我们就统计他的数目 不是就不用。
那么根据枚举的思路我们可以先写一段伪代码:

for(int i = 2;i<n;++i)
{
	if(isprime(n))
		cnt++;
}

这就是一个标准的枚举解决方法的思路,这题的主要难点在哪里呢,就是计算这个数是不是质数 这个问题我们还是可以用枚举解决:
枚举的范围可以先定成 小于n/2的数 这是显然的 因为数字不可能整除比他的一半还大的数吧 ,枚举的对象就是 0-n/2的数字,目标就是看 n能不能整除我们枚举的对象 可以那就说明不是质数。所以代码如下

bool isPrime(int n)
{
    for(int i = 2;i<=n/2;++i)
    {
        if( n%i == 0)
        return false;
    }
    return true;
}

代码写到这,这题可以结束了 但是还有一个小的问题 我们提交答案看一下:
在这里插入图片描述

可以看到对于一般的例子,我们是可以通过的,这说明代码的逻辑没问题,但是:
在这里插入图片描述
会超出时间限制 这就是问题所在,所以我们要进行枚举的第三步 缩减枚举的范围:
在这里提供两种思路 一种是把isprime函数里面的i<n/2变成i<根号2 也就是i × i<2 为什么可以这么写呢,简单证明如下:
在这里插入图片描述
再接下来一种思路就是埃氏筛或者线性筛 这两种方法和枚举其实关系不大,感兴趣的同学可以去查一下。

通过缩小枚举的范围 我们就可以达到缩小时间复杂度的目的。

练习

统计格内点的数目
这是一道大家回去自己练习的小题 ,在这里我给出其中一种解法 大家可以自由发挥。

class Solution {
public:
        bool incircle(vector<vector<int>>& circles, int x, int y)
    {
        for (int i = 0; i < circles.size(); ++i)
        {
            int a = circles[i][0];
            int b = circles[i][1];
            int r = circles[i][2];
            if ((x - a) * (x - a) + (y - b) * (y - b)
                <= r * r)
                return true;
        }
        return false;
    }
    int countLatticePoints(vector<vector<int>>& circles) {
        //确定区间 区间为上下左右 
        int cnt = 0;
        int up, down, left, right;
        up = -1;
        down = 101;
        left = 101;
        right = -1;
        for (int i = 0; i < circles.size(); ++i)
        {
            int   r = circles[i][2];
            int   x = circles[i][0];
            int   y = circles[i][1];
            if (y-r < down)
                down = y - r;
            if (y + r > up)
                up = y + r;
            if (x - r < left)
                left = x - r;
            if (r + x > right)
                right = r + x;
        }
        //确定区间以后枚举遍历
        for (int i = left; i <= right; ++i)
        {
            for (int j = down; j <= up; ++j)
            {
                if (incircle(circles, i, j))
                    cnt++;
            }
        }
        return cnt;
    }
};

有啥问题都可以提出来 ,博主有啥问题也恳请斧正,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NGINX高性能服务器与关键概念解析

目录 1 NGINX简介2 NGINX的特性3 正向代理4 反向代理5 负载均衡6 动静分离7 高可用8 结语 1 NGINX简介 NGINX&#xff08;“engine x”&#xff09;在网络服务器和代理服务器领域备受推崇。作为一款高性能的 HTTP 和反向代理服务器&#xff0c;它以轻量级、高并发处理能力以及…

供配电运维智能监控系统

供配电运维智能监控系统是一种针对供配电系统的智能监控设备&#xff0c;依托电易云-智慧电力物联网&#xff0c;旨在实现对供配电系统的实时监控、数据记录和分析&#xff0c;以及异常预警和故障检测等功能&#xff0c;以提高供配电系统的可靠性和稳定性。 该系统通常由以下部…

WhatsApp全球获客怎么做?

一、导语 随着全球数字化趋势的加速&#xff0c;WhatsApp作为一种即时通讯工具&#xff0c;已经成为了连接全球用户的桥梁。 对于企业和营销人员来说&#xff0c;利用WhatsApp拓展全球业务是一种非常有效的策略&#xff0c;本文将为您揭示WhatsApp全球获客的秘密&#xff0c;…

【小尘送书-第十三期】Python从入门到精通(第3版)(软件开发视频大讲堂)

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

python:六种算法(RFO、SSA、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、六种算法简介 1、红狐优化算法RFO 2、麻雀搜索算法SSA 3、鲸鱼优化算法WOA 4、灰狼优化算法GWO 5、粒子群优化算法PSO 6、遗传算法GA 二、6种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolution…

简单了解RNN循环神经网络

为什么需要RNN&#xff08;循环神经网络&#xff09; 将神经网络模型训练好之后&#xff0c;在输入层给定一个x&#xff0c;通过网络之后就能够在输出层得到特定的y&#xff0c;那么既然有了这么强大的模型&#xff0c;为什么还需要RNN&#xff08;循环神经网络&#xff09;呢…

资深测试总结,性能测试目的如何做?主要看什么指标?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试是什么…

学生管理系统 数据库版

如题&#xff1a; 一.SQL部分 a. b. c. 修改&#xff1a; 二.Java部分 代码&#xff1a; 结果

STM32CubeIDE串口空闲中断实现不定长数据接收

STM32F051空闲中断实现串口不定长数据接收 目的编程软件配置串口开中断中断程序 运行结果 目的 在串口输入不定长数据时&#xff0c;通过串口空闲中断来断帧接收数据。 编程软件 STM32CubeIDE STM32CubeMX配置MCU。通过对端口配置&#xff0c;自动生成程序&#xff0c;减少编…

Godot Engine:跨平台游戏开发的新境界 | 开源日报 No.92

godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎&#xff0c;可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具&#xff0c;让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上&#xff0c;包…

3D漫游:沉浸式数字空间,步进式漫游新体验

5G时代的普及&#xff0c;使得人们对信息获取的要求越来越高&#xff0c;同时标准也越来越严格&#xff0c;3D漫游虚拟空间的体验&#xff0c;为很多用户提供了更加直观、生动的视觉体验。3D步进式漫游以其生动逼真的视觉效果和沉浸式体验&#xff0c;吸引着人们的关注以及多种…

lwIP 细节之四:recv 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

射频功率放大器的参数有哪些

射频功率放大器是射频通信系统中重要的组件&#xff0c;用于将输入的射频信号放大到需要的功率水平。在设计和选择射频功率放大器时&#xff0c;需要考虑多种参数。下面西安安泰将详细介绍射频功率放大器的常见参数。 1、P1dB功率压缩点 当放大器的输入功率比较低时&#xff0c…

如何通过控制台排查定位EasyCore?

过去当数据库出现了问题&#xff0c;我们只能通过日志去查看问题&#xff0c;可能是数据库有了重启、主节点发生了漂移或查询语句太复杂&#xff0c;这一整套逻辑走下来只能winsen, karel。 我们经常说数据库负载过高&#xff0c;请求很多&#xff0c;但我们却不能直接告诉哪个…

MyBatis-Plus - 论自定义 BaseMapper 方法『逻辑删』失效解决方案

问题描述 在上一篇我们讲过 MyBatis-Plus - 论 1 个实体类被 N 个DAO 类绑定&#xff0c;导致 MP 特性&#xff08;逻辑删&#xff09;失效的解决方案-CSDN博客 所以在这个基础上&#xff0c;我们可以很好定位到源码的分析位置。 但是今天这个问题就更奇怪了&#xff0c;已经…

springMVC 学习总结(三) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…

基于ssm的珠宝首饰交易平台开发论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于珠宝首饰交易平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了珠宝首饰交易平台&#xff0c;它彻底改变了过…

从头到尾的数据之旅

目录 引言 链表介绍 单向链表的接口实现 结构 创建节点 头插 尾插 头删 尾删 打印 节点查找 节点前插入 节点删除 内存释放 总结 引言 在前面的学习中&#xff0c;我们深入了解了顺序表&#xff0c;通过其增删查改的操作&#xff0c;我们发现了顺序表在某些情况…

移液器吸头材质选择——PFA吸头在半导体化工行业的应用

PFA吸头是一种高性能移液器配件&#xff0c;这种材料具有优异的耐化学品、耐热和电绝缘性能&#xff0c;使得PFA吸头在应用中表现出色。那么它有哪些特点呢&#xff1f; 首先&#xff0c;PFA吸头具有卓越的耐化学腐蚀性能。无论是酸性溶液、碱性溶液还是有机溶剂&#xff0c;P…

【pytest】单元测试文件的写法

前言 可怜的宾馆&#xff0c;可怜得像被12月的冷雨淋湿的一条三只腿的黑狗。——《舞舞舞》 \;\\\;\\\; 目录 前言test_1或s_test格式非测试文件pytest.fixture()装饰器pytestselenium test_1或s_test格式 要么 test_前缀 在前&#xff0c;要么 _test后缀 在后&#xff01; …