[Leetcode小记] 3233. 统计不是特殊数字的数字数量

代码:

方法一:平凡解法(最直观但时间复杂度最高)

class Solution {public int nonSpecialCount(int l, int r) {int res=r-l+1;//初始不是特殊数字的答案为[l,r]范围内数字总数for(int i=(int)Math.ceil(Math.sqrt(l));i<=(int)Math.floor(Math.sqrt(r));i++){if(isPrime(i)) res--;//如果是质数,说明是特殊数字,则不是特殊数字的数-1}return res;}private boolean isPrime(int number){//判断数字是否是质数if(number==1) return false;if(number==2) return true;for(int i=2;i<=(int)Math.sqrt(number);i++){if(number%i==0) return false;}return true;}
}

时间复杂度:对于 nonSpecialCount 方法中的每个i,isPrime 方法被调用一次,其时间复杂度为O(\sqrt{i}),由于 i 的范围是\left \lceil \sqrt{l} \right \rceil\left \lfloor \sqrt{r} \right \rfloor,需要计算这些调用的总时间复杂度。

在最坏情况下,当 l=1 且 r 非常大时,nonSpecialCount 方法的时间复杂度主要由以下部分组成:

①循环次数:最多\sqrt{r}次;②每次循环中调用 isPrime 的时间复杂度为O(\sqrt{i}),其中i最大值为\sqrt{r}。因此,总时间复杂度可以近似为:\sum_{i=\sqrt{l}}^{\sqrt{r}}O(\sqrt{i}) 。由于\sqrt{i}是递增的,并且主要关心的是当 r 非常大时的行为,这个求和可以近似为:O(\sqrt{r})*O(\sqrt{\sqrt{r}})=O(\sqrt{r}*r_{}^{1/4})=O(r_{}^{3/4}),其中 r 是给定的区间上界。(注:该计算为较宽松的估计,实际上由于 i​ 的增长速度较慢,并且并不是对每一个 i 都进行到 \sqrt{r}的检查(而是到\sqrt{i}),实际运行时间可能会比该估计要快。但从理论上看,该估计给出了一个上界。)

空间复杂度:O(1)

方法二:埃拉托斯特尼筛法(埃氏筛) 

参考链接:https://leetcode.cn/problems/find-the-count-of-numbers-which-are-not-special/solutions/2860320/3233-tong-ji-bu-shi-te-shu-shu-zi-de-shu-enhg/

原理:“埃拉托斯特尼筛法,简称埃氏筛,是由希腊数学家埃拉托斯特尼提出的筛选质数的算法。埃氏筛的原理是:对于质数 p,所有大于 p 的 p 的倍数都是合数,根据该性质移除所有的合数。

使用埃氏筛得到不超过 upperBound 的所有质数的做法是:使用列表记录从 2 到 upperBound 的所有整数,每次保留列表中的最小整数 p,将 p 保留,并将列表中的所有大于 p 的 p 的倍数都删除,当没有更多的整数可以删除时,剩下的数就是不超过 upperBound 的所有质数。”

class Solution {public int nonSpecialCount(int l, int r) {int lowerBound = (int) Math.ceil(Math.sqrt(l));//下界int upperBound = (int) Math.floor(Math.sqrt(r));//上界boolean[] isPrime = new boolean[upperBound + 1];Arrays.fill(isPrime, true);isPrime[0] = false;isPrime[1] = false;for(int i = 2; i * i <= upperBound; i++) {if(isPrime[i]) {for(int j = i * i; j <= upperBound; j += i) isPrime[j] = false;}}int res = 0;for(int i = lowerBound; i <= upperBound; i++) {if(isPrime[i]) res++;}return r-l+1-res;//总数减去是特殊数字的数量即为不是特殊数字的数量}
}

时间复杂度:O(\sqrt{r}\log \log\sqrt{r}),其中 r 是给定的区间上界。

空间复杂度:O(\sqrt{r}),其中 r 是给定的区间上界。

方法三:欧拉筛(线性筛)->避免重复标记

参考链接:​​​​​​​https://leetcode.cn/problems/find-the-count-of-numbers-which-are-not-special/solutions/2860320/3233-tong-ji-bu-shi-te-shu-shu-zi-de-shu-enhg/

该方法可看作是方法二的改进版,因为埃氏筛存在重复标记的情况,如果一个合数有多个不同的质因数,则会被标记多次,比如30会被2、3、5分别标记一次。

原理(引用自参考链接):

class Solution {public int nonSpecialCount(int l, int r) {int lb = (int) Math.ceil(Math.sqrt(l));//下界int ub = (int) Math.floor(Math.sqrt(r));//上界List<Integer> primes = new ArrayList<Integer>();boolean[] isPrime = new boolean[ub+1];Arrays.fill(isPrime, true);isPrime[0] = false;isPrime[1] = false;for(int i=2;i<=ub;i++) {if(isPrime[i]) primes.add(i);for(int prime:primes) {if(i*prime<=ub) {isPrime[i*prime]=false;if(i%prime==0) break;}else break;}}int res=0;for(int i=lb;i<=ub;i++){if(isPrime[i]) res++;//是特殊数字的数字数量}return r-l+1-res;//总数-是特殊数字的数字数量即为题目答案}
}

时间复杂度:O(\sqrt{r}),其中 r 是给定的区间上界。

空间复杂度:O(\sqrt{r}),其中 r 是给定的区间上界。

方法四:求范围内质数

参考链接:https://leetcode.cn/problems/find-the-count-of-numbers-which-are-not-special/solutions/2887918/3233-tong-ji-bu-shi-te-shu-shu-zi-de-shu-zxa2/

该方法可看作是方法一的优化。
思路:首先根据题意,特殊数字是指除1和本身外只包含一个质数的数字。即相当于质数的平方。然后对数据进行预处理,判断范围内的质数。对于质数范围,假设右边界r是特殊数字,则必然存在一个质数Math.sqrt(r),即为质数范围最大值。然后完成问题转换,将[l,r]区间单个进行枚举判断,转为根据范围内质数算出特殊数字,并判断是否落在区间内。最后用总数减去特殊数字个数即为题目结果。

class Solution {public int nonSpecialCount(int l, int r) {int n = (int) Math.sqrt(r) + 1;boolean[] pir = getPrimeInRange(n);// 统计特殊数字个数int res=0;for (int i = 0; i < pir.length ;i++) {if (!pir[i]) continue;// 当前i为质数,num为特殊数字int num=i*i;// 判断特殊数字是否落在lr区间内if (num > r) break;else if (num < l) continue;else res++;}return r-l+1-res;}private static boolean[] getPrimeInRange(int n) {// 函数作用:判断范围内的质数boolean[] isPrime = new boolean[n];// 使用数组存储该位是否为质数Arrays.fill(isPrime, true);isPrime[1] = false;for(int i=2;i*i<n;i++) {if(isPrime[i]) {for (int j = i * i; j < n; j += i) isPrime[j] = false; // 原数是质数,在范围n内累乘迭代,结果均为非质数}}return isPrime;}
}

时间复杂度:O(n\log n)

空间复杂度:O(n)

方法五:预处理质数(灵神解法)

(该方法较为巧妙)

参考链接:https://leetcode.cn/problems/find-the-count-of-numbers-which-are-not-special/solutions/2860276/yu-chu-li-zhi-shu-o1hui-da-pythonjavacgo-7xaq/

class Solution {private static final int Max = 31622;private static final int[] p = new int[Max + 1];static{for (int i = 2; i <= Max; i++) {if (p[i] == 0){// i 是质数p[i] = p[i-1] + 1;for (int j = i * i; j <=Max; j += i) p[j] = -1; // 标记 i 的倍数为合数 // 注:如果 MX 比较大,小心 i*i 溢出} else p[i] = p[i - 1];}}public int nonSpecialCount(int l, int r) {return r-l+1-(p[(int)Math.sqrt(r)]-p[(int)Math.sqrt(l-1)]);}
}

时间复杂度:O(1),预处理不计。

空间复杂度:O(1),预处理不计。

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

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

相关文章

jenkins 2.346.1最后一个支持java8的版本搭建

1.jenkins下载 下载地址&#xff1a;Index of /war-stable/2.346.1 2.部署 创建目标文件夹&#xff0c;移动到指定位置 创建一个启动脚本&#xff0c;deploy.sh #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/opt/projects/jenkins # 服务名称。同时约定部…

package.json中^1.x.x、~1.x.x、1.x.x有什么区别

目录 包版本号的语义化 包版本号的符号 举例 包版本号的语义化 在开始回答这个问题之前&#xff0c;先简单介绍一下包版本号的语义化。 在npm中&#xff0c;包的版本号通常遵循语义化版本规范&#xff08;Semantic Versioning&#xff09;&#xff0c;即采用 major.minor.p…

el-table :span-method 合并单元格(2.0)

2024.11.23今天我学习了如何使用el-table组件的合并单元格方法&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <template><div class"container"><el-table :data"table_data" :span-method"object_merge" border>&…

CWT-CNN-SABO-LSSVM | Matlab实现基于CWT-CNN-SABO-LSSVM对滚动轴承的故障诊断

CWT-CNN-SABO-LSSVM | Matlab实现基于CWT-CNN-SABO-LSSVM对滚动轴承的故障诊断 目录 CWT-CNN-SABO-LSSVM | Matlab实现基于CWT-CNN-SABO-LSSVM对滚动轴承的故障诊断分类效果基本描述程序设计参考资料 分类效果 基本描述 基于CWT-CNN-SABO-LSSVM对滚动轴承的故障诊断 matlab代码…

Java基于SSM框架的校园综合服务小程序【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

WPF——ICON按钮制作

前言 首先ICON按钮&#xff0c;即带图标按钮&#xff0c;即图标按钮。 图标按钮在开发时&#xff0c;主要是有两种方式来进行。一是在Button的Content内添加Image&#xff0c;然后设置Image的属性Source来实现&#xff0c;这种方式主要是简单易操作&#xff0c;对于初学者来说…

LlamaIndex ollama 搭建本地RAG应用,建立本地知识库

目录 简介安装前的准备下载ollama创建llamaindex conda环境&#xff0c;为后面编码作准备 环境变量迁移ollama到其他盘运行ollama方式一方式二禁止ollama开机自启动运行第一个模型 Chatbox聊天下载Chatbox配置ollama地址和模型验证 建立自身特定知识数据搭配大语言模型创建项目…

[RabbitMQ] 重试机制+TTL+死信队列

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

ChatGPT 桌面版发布了,如何安装?

本章教程教大家如何进行安装。 一、下载安装包 官网地址地址&#xff1a;https://openai.com/chatgpt/desktop/ 支持Windows和MacOS操作系统 二、安装步骤 Windows用户下载之后&#xff0c;会有一个exe安装包&#xff0c;点击运行安装即可。 注意事项&#xff0c;如果Windows操…

uniapp vue2项目迁移vue3项目

uniapp vue2项目迁移vue3项目&#xff0c;必须适配的部分 一、main.js 创建应用实例 // 之前 - Vue 2 import Vue from vue import App from ./App Vue.config.productionTip false // vue3 不再需要 App.mpType app // vue3 不再需要 const app new Vue({ ...App }) …

Brain.js 用于浏览器的 GPU 加速神经网络

Brain.js 是一个强大的 JavaScript 库&#xff0c;它允许开发者在浏览器和 Node.js 环境中构建和训练神经网络 。这个库的目的是简化机器学习模型的集成过程&#xff0c;使得即使是没有深厚机器学习背景的开发者也能快速上手 。 概述 Brain.js 提供了易于使用的 API&#xff…

群核科技首次公开“双核技术引擎”,发布多模态CAD大模型

11月20日&#xff0c;群核科技在杭州举办了第九届酷科技峰会。现场&#xff0c;群核科技首次正式介绍其技术底层核心&#xff1a;基于GPU高性能计算的物理世界模拟器。并对外公开了两大技术引擎&#xff1a;群核启真&#xff08;渲染&#xff09;引擎和群核矩阵&#xff08;CAD…

oracle会话追踪

一 跟踪当前会话 1.1 查看当前会话的SID,SERIAL# #在当前会话里执行 示例&#xff1a; SQL> select distinct userenv(sid) from v$mystat; USERENV(SID) -------------- 1945 SQL> select distinct sid,serial# from v$session where sid1945; SID SERIAL# …

算法-快速排序-Python版详解

原题如下&#xff1a; 给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n 个整数&#xff08;所有整数均在 1∼10^9 范围内&#xff09;&am…

strlwr(arr);的模拟实现(c基础)

hi , I am 36 适合对象c语言初学者 strlwr(arr)&#xff1b;函数是把arr数组变为小写字母,并返回arr 链接介绍一下strlwr(arr)&#xff1b;(c基础)-CSDN博客 下面进行My__strlwr(arr);模拟实现 #include<stdio.h> //返回值为arr(地址),于是用指针变量,原数组为字符型…

Hadoop分布式文件系统(一)——HDFS简介

目录 1. HDFS设计目标2. HDFS组件3. HDFS数据复制4. HDFS健壮性4.1 磁盘数据错误&#xff0c;心跳检测和重新复制4.2 集群均衡4.3 数据完整性4.4 元数据磁盘错误4.5 快照 5. HDFS数据组织5.1 数据块存储5.2 流水线复制5.3 文件的删除和恢复 参考 1. HDFS设计目标 1.错误检测和快…

基于UDP和TCP实现回显服务器

目录 一. UDP 回显服务器 1. UDP Echo Server 2. UDP Echo Client 二. TCP 回显服务器 1. TCP Echo Server 2. TCP Echo Client 回显服务器 (Echo Server) 就是客户端发送什么样的请求, 服务器就返回什么样的响应, 没有任何的计算和处理逻辑. 一. UDP 回显服务器 1. UD…

STM32完全学习——使用标准库完成PWM输出

一、TIM2初始化 我这里使用的是STM32F407ZGT6这个芯片&#xff0c;我这里使用的是定时器TIM2来完成PWM输出&#xff0c;由于这里没有使用中断&#xff0c;因此不需要初始化NVIC&#xff0c;下面先来进行定时器的相关初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;R…

Qt Qt::UniqueConnection 底层调用

在这里插入图片描述 步骤1&#xff1a; 1&#xff1a;判断槽函数连接方式&#xff0c; 以及信号对象是否有效2&#xff1a; 信号计算格式是否 大于 signal_index 目前调试 signal_index 不太清楚怎末计算的&#xff08;有清楚的帮忙街道&#xff09;3&#xff1a;获取槽函数对…

7-10 解一元二次方程

7-10 解一元二次方程 分数 20 全屏浏览 切换布局 作者 李祥 单位 湖北经济学院 请编写程序&#xff0c;解一元一次方程 ax2bxc0 。 已知一元二次方程的求根公式为&#xff1a; 要求&#xff1a; 若 a0&#xff0c;则为一元一次方程。 若 b0&#xff0c;则方程有唯一解&…