算法-基础算法-枚举算法(Python)

文章目录

  • 前言
  • 解题思路
  • 题目
    • 1 两数之和
    • 2计数质数


前言

  枚举算法(Enumeration Algorithm):也称为穷举算法,指的是按照问题本身的性质,一 一列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复。
  枚举算法的核心思想是:通过列举问题的所有状态,将它们逐一与目标状态进行比较,从而得到满足条件的解。
  由于枚举算法要通过列举问题的所有状态来得到满足条件的解,因此,在问题规模变大时,其效率一般是比较低的。但是枚举算法也有自己特有的优点:
  1多数情况下容易编程实现,也容易调试。
  2建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。
  所以,枚举算法通常用于求解问题规模比较小的问题,或者作为求解问题的一个子算法出现,通过枚举一些信息并进行保存,而这些消息的有无对主算法效率的高低有着较大影响。

解题思路

  采用枚举算法解题的一般思路如下:
  确定枚举对象、枚举范围和判断条件,并判断条件设立的正确性。

  1. 一 一枚举可能的情况,并验证是否是问题的解。
  2. 2考虑提高枚举算法的效率。
    我们可以从下面几个方面考虑提高算法的效率:
    1抓住问题状态的本质,尽可能缩小问题状态空间的大小。
    2加强约束条件,缩小枚举范围。
    3根据某些问题特有的性质,例如对称性等,避免对本质相同的状态重复求解。

题目

1 两数之和

描述:给定一个整数数组 numsnums 和一个整数目标值 targettarget。
要求:在该数组中找出和为 targettarget 的两个整数,并输出这两个整数的下标。可以按任意顺序返回答案。
示例
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

思路
1使用两重循环枚举数组中每一个数nums[i]、nums[j]判断所有的 nums[i]+nums[j]是否等于target。
2 如果出现 nums[i]+nums[j]==target,则说明数组中存在和为target的两个整数,将两个整数的下标ij输出即可。

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 []

2计数质数

描述:给定 一个非负整数 n。
要求:统计小于 n的质数数量。
  对于小于n的每一个数 x,我们可以枚举区间[2,x−1]上的数是否是x的因数,即是否存在能被x整数的数。如果存在,则该数x不是质数。如果不存在,则该数x是质数。
  这样我们就可以通过枚举[2,n−1]上的所有数x,并判断x是否为质数。
  在遍历枚举的同时,我们维护一个用于统计小于n的质数数量的变量cnt。如果符合要求,则将计数cnt加1。最终返回该数目作为答案。
  考虑到如果i是x的因数,则xi也必然是x的因数,则我们只需要检验这两个因数中的较小数即可。而较小数一定会落在[2,根号x]上。因此我们在检验 x是否为质数时,只需要枚举[2,根号x] 中的所有数即可。
  利用枚举算法单次检查单个数的时间复杂度为O(根号n),检查n个数的整体时间复杂度为O(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

你可能感兴趣的:(算法与数据结构,算法,leetcode)