【leetcode刷题day1】枚举法

题目1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

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

解析

  • 常规做法 通过双层循环进行枚举。第一层循环列举数组中的每个值num,第二层循环判断每个值是否等于target - num。
  • 优化做法 使用哈希表。在第二层循环中的目标是找到是否有等于target - num的值,其优化做法为使用哈希表,可将复杂度从O(n)降低为O(1)。使用哈希表查找就是创造一个哈希表(字典),以num为key, 下标为value。 如果target - num存在字典中( target - num in hashtable),就可以直接返回相对应的下标hash[target - num]

题目2 204. 计数质数 - 力扣(LeetCode)

给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

解析

  • 通用 判断一个数是否为素数:没有从2到sqrt(n)的因子(即被其整除)
  • 常规做法 遍历所有小于非负整数n的数,判断是否为素数,把素数的个数加起来。时间复杂度为O(nsqrt(n)
  • 埃氏筛 如果一个数x是质数,那么2x,3x,4x…xx, x(x+1)都不是质数。因此判断一个数x是质数的时候,可以把x的倍数都筛选出来,他们都不是质数。-> 优化为可以把xx, x(x+1), x*(x+2)…都筛选出来,因为2x,3x,4x已经被2,3,4筛选过了。

语法易错点总结

  1. range(i,j)为左闭右开
  2. 使用sqrt()前要加上math.sqrt(), 返回的是浮点数。isqrt()返回的是一个不大于sqrt()的整数
  3. 定义一个长度为n的数组,初始化为0:list = [0] *n
  4. 判断某个值是否在字典中: x in hashtable
  5. 定义一个集合: my_set = set(), 往集合内增加元素使用.add(x), 集合可以去重
  6. x的n次方: x**n (不是x^n)

猜你喜欢

转载自blog.csdn.net/a61022706/article/details/134939671