题目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筛选过了。
语法易错点总结
- range(i,j)为左闭右开
- 使用sqrt()前要加上math.sqrt(), 返回的是浮点数。isqrt()返回的是一个不大于sqrt()的整数
- 定义一个长度为n的数组,初始化为0:list = [0] *n
- 判断某个值是否在字典中: x in hashtable
- 定义一个集合: my_set = set(), 往集合内增加元素使用.add(x), 集合可以去重
- x的n次方: x**n (不是x^n)