[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,一经查实,立即删除!

相关文章

神经网络的初始化

目录 为什么需要初始化&#xff1f; 初始化的常用方法&#xff1a; 是否必须初始化&#xff1f; 初始化神经网络中的权重和偏置是深度学习模型训练中非常重要的一步&#xff0c;虽然在某些情况下不进行初始化也能训练出模型&#xff0c;但正确的初始化方法能够显著提高训练效…

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 # 服务名称。同时约定部…

详解Qt QStorageInfo 存储信息类

文章目录 QStorageInfo 详解前言什么是 QStorageInfo&#xff1f;QStorageInfo 的构造函数和常用成员函数构造函数1. 默认构造函数2. 指定路径构造函数 常用成员函数1. 获取存储设备根路径rootPath 2. 获取总容量bytesTotal 3. 获取可用空间bytesAvailable 4. 获取文件系统类型…

vue2 src_Todolist编辑($nextTick)

main.js //引入Vue import Vue from "vue"; //引入App import App from ./App;//关闭Vue的生产提示 Vue.config.productionTip false;new Vue({el: #app,render: h > h(App),beforeCreate() {//事件总线Vue.prototype.$bus this;} });App.vue <template>…

bash笔记

0 $0 是脚本的名称&#xff0c;$# 是传入的参数数量&#xff0c;$1 是第一个参数&#xff0c;$BOOK_ID 是变量BOOK_ID的内容 1 -echo用于在命令窗口输出信息 -$()&#xff1a;是命令替换的语法。$(...) 会执行括号内的命令&#xff0c;并将其输出捕获为一个字符串&#xff…

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

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

Linux 下的 AWK 命令详细指南与示例

目录 简介AWK 的主要特性基本语法示例1. 打印文件的所有行2. 打印特定字段3. 打印匹配模式的行4. 基于条件过滤并打印5. 使用内置变量6. 执行算术运算7. 字符串操作8. 使用 BEGIN 和 END 块9. 处理分隔符文件 高级功能自定义脚本使用外部变量 总结 简介 AWK 是 Linux 中功能强…

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>&…

Shell 脚本基础(7):重定向详解

内容预览 ≧∀≦ゞ Shell 脚本基础&#xff08;7&#xff09;&#xff1a;重定向详解声明1. 重定向基础概念1.1 输出重定向&#xff08;> 和 >>&#xff09;覆盖写入&#xff08;>&#xff09;追加写入&#xff08;>>&#xff09;输出到终端和文件&#xff0…

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操…

真实网络安全面试场景题

1.公司内部搭建了2台DNS服务器做主辅同步&#xff0c;公司的业务官网地址为 www.chinaddic.com。小明作为网络管理员把域名添加至DNS服务器进行测试。 问题1:使用自己电脑可以正常访问刚添加的域名&#xff0c;但处于同样网络环境同事电脑却访问不了。 出现此问题原因…

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# …