Leedcode day1笔记 枚举算法

枚举算法简介

枚举算法:也称为穷举算法,指的是按照问题本身的性质,列举出该问题所有可能的解,并在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。在列举的过程中,既不能遗漏也不能重复。
优势:

  1. 多数情况下容易编程实现,也容易调试。
  2. 建立在考察大量状态、甚至是穷举所有状态的基础上,所以算法的正确性比较容易证明。

劣势:

  1. 通过列举问题的所有状态来得到满足条件的解,当当数据量很大时,时间复杂度和空间复杂度很大,导致效率较低。

枚举算法的应用

习题

  1. 两数之和:给定一个整数数组 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的两个整数,将两个整数的下标输出即可。

  1. 计数质数:给定一个非负整数 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是否为质数。

  1. 三元数组:给出一个整数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,并且是完全平方数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值