枚举算法简介
枚举算法:也称为穷举算法,指的是按照问题本身的性质,列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复。
优势:
- 多数情况下容易编程实现,也容易调试。
- 建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。
劣势:
- 通过列举问题的所有状态来得到满足条件的解,当当数据量很大时,时间复杂度和空间复杂度很大,导致效率较低。
枚举算法的应用
习题
- 两数之和:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个 整数,并返回它们的数组下标。
from typing import List
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if i != j and nums[i] + nums[j] == target:
return [i, j]
return []
# 创建Solution的实例
solution = Solution()
print(solution.twoSum([2, 7, 11, 15], 17)) # [0, 3]
解题思路:使用两次循环枚举数组中每一个nums[i],判断所有的nums[i] + num[i]是否等于target。如果出现nums[i] + nums[i] == target,则说明数组中存在和为target的两个整数,将两个整数的下标输出即可。
- 计数质数:给定一个非负整数 n,要求:统计小于n的质数数量。
class Solution:
def isPrime(self, x):
for i in range(2, int(pow(x, 0.5)) + 1):
if x % i == 0:
return False
return True
def countPrimes(self, n: int) -> int:
cnt = 0
for x in range(2, n):
if self.isPrime(x):
cnt += 1
return cnt
solution = Solution()
print(solution.countPrimes(12))
解题思路:对于小于n的每个数x,我们可以枚举区间[2, x-1]上的数是否是x的因数,及是否存在能被x整除的数。如果存在,则该数x不是质数。如果不存在,则该数x是质数。这样我们就可以通过枚举[2, n-1]上的所有数x,并判断x是否为质数。
- 三元数组:给出一个整数n,返回满足n以内的平方和三元组的数目。也就是说有a、b、c三个整数满足 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2。
from math import sqrt
class Solution:
def countTriples(self, n: int) -> int:
cnt = 0
for a in range(1, n + 1):
for b in range(1, n + 1):
c = int(sqrt(a * a + b * b + 1))
if c <= n and a * a + b * b == c * c:
cnt += 1
return cnt
solution = Solution()
print(solution.countTriples(5)) # 2
解题思路:我们可以在[1,n]区间中枚举整数三元组(a,b,c)中的a和b。然后判断 a 2 + b 2 a^2+b^2 a2+b2是否小于等于n,并且是完全平方数。