leetcode-枚举算法

1.两数之和

题目一:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

def twoSum(nums, target):
    # 方法一:
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            if i != j and nums[i] + nums[j] == target:
                print([i, j])
                return [i, j]
    # 方法二:
    for idx, num in enumerate(nums):
        if idx + 1 == len(nums):
            break
        next_num = nums[idx + 1]
        if idx != idx + 1 and num + next_num == target:
            print([idx, idx + 1])
            return [idx, idx + 1]


if __name__ == '__main__':
    nums = [2, 7, 11, 15]
    target = 9
    twoSum(nums, target)

2.计数质数

题目二:计数质数
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。

示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

示例 2:
输入:n = 0
输出:0

示例 3:
输入:n = 1
输出:0

def countPrimes(n):
    res = 0
    for i in range(2, n):
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            print(i)
            res += 1
    return res


if __name__ == '__main__':
    countPrimes(10)

3.统计平方和三元组的数目

题目三:统计平方和三元组的数目

一个 平方和三元组 (a,b,c) 指的是满足 a2 + b2 = c2 的 整数 三元组 a,b 和 c 。
给你一个整数 n ,请你返回满足 1 <= a, b, c <= n 的 平方和三元组 的数目。

示例 1:
输入:n = 5
输出:2
解释:平方和三元组为 (3,4,5) 和 (4,3,5) 。

示例 2:
输入:n = 10
输出:4
解释:平方和三元组为 (3,4,5),(4,3,5),(6,8,10) 和 (8,6,10) 。

def countTriplets(n):
    import math
    count = 0
    for i in range(1,n+1):
        for j in range(1,n+1):
            c = int(math.sqrt(i*i+j*j))
            if c<=n and i*i+j*j==c*c:
                print(i,j,c)
                count += 1
                return count

if __name__ == '__main__':
    countTriplets(5)

4.公因子的数目

给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。
如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。

示例 1:
输入:a = 12, b = 6
输出:4
解释:12 和 6 的公因子是 1、2、3、6 。

示例 2:
输入:a = 25, b = 30
输出:2
解释:25 和 30 的公因子是 1、5 。

def commonFactors(self, a: int, b: int) -> int:
        count = 0
        for i in range(1,1001):
            if a%i==0  and b%i == 0:
                count += 1
        return count

5.文件组合

待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个 正整数(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组合列表。

注意,返回时需遵循以下规则:

每种组合按照文件编号 升序 排列;
不同组合按照第一个文件编号 升序 排列。

def fileCombination(self, target: int) -> List[List[int]]:
        i, j, res = 1, 2, []
        # 只要超过中间值,就会不满足条件,比如9=5+x,x永远需要比中值5while j <= target // 2 + 1:
            # 窗口内的值相加
            cur_sum = sum(list(range(i, j + 1)))
            if cur_sum < target:
                j += 1
            elif cur_sum > target:
                i += 1
            else:
                res.append(list(range(i, j + 1)))
                j += 1
        return res

6.统计圆内格点数目

给你一个二维整数数组 circles ,其中 circles[i] = [xi, yi, ri] 表示网格上圆心为 (xi, yi) 且半径为 ri 的第 i 个圆,返回出现在 至少一个 圆内的 格点数目 。

注意:

格点 是指整数坐标对应的点。
圆周上的点 也被视为出现在圆内的点。
在这里插入图片描述
在这里插入图片描述

class Solution:
    def countLatticePoints(self, circles: List[List[int]]) -> int:
        points = set()
        for x, y, r in circles:
            # 遍历x,y的最大值、最小值区间范围
            for i in range(x - r, x + r + 1):
                for j in range(y - r, y + r + 1):
                    # 用两点之间的距离公式计算
                    if (i - x) ** 2 + (j - y) ** 2 <= r**2:
                        points.add((i, j))
        return len(points)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值