Leetcode之PHP版题目解析(204. Count Primes)
2019-3-29 星期五 开始吧
上一题链接 Leetcode之PHP版题目解析(189. Rotate Array)
题目描述
给定一个整数n,返回不大于它的素数的个数。(0和1不是素数)
题目案例
案例中给定10,返回4个,分别是2,3,5,7.
题目分析
我们先来看一段恐怖的代码,它的思路就是先定义一个额外的数组,只要当前数组中不存在这个数,我们把当前数存入数组并设置为素数,计数器加1,然后再把他所有的倍数值出来作为数组的非素数(倍数不可能是素数),由于我这的判断条件是<n,但是我们已经求的每个数的倍数,相当于我们做了多余的操作,随着数字越大,我们的效率就越低,直接超时。
这段恐怖代码
/** * @param Integer $n * @return Integer */ function countPrimes($n) { $array=[]; $nums=0; for($i=2;$i<$n;$i++) { if($array[$i]===NULL){ $array[$i]=1; $nums++; $y=2; while($i*$y<$n) { $array[$i*$y]=0; $y++; } } } return $nums; }
改进
正如我说的,我们应该 标记已经确定不是素数的数字,我们不需要再重复的去处理,避免高额的调用。
具体实现
/** * @param Integer $n * @return Integer */ function countPrimes($n) { $is_primes=[]; for($i=2;$i<$n;$i++) { $is_primes[$i]=true; } for($i=2;$i*$i<$n;$i++) { if($is_primes[$i]===false) continue; for($j=$i*$i;$j<$n;$j +=$i) { $is_primes[$j]=false; } } $count=0; for($i=2;$i<$n;$i++) { if($is_primes[$i]) $count++; } return $count; }
Github整理地址:https://github.com/wuqinqiang/leetcode-php
No Comments