马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
注:你的关注,点赞,评论让我不绝更新
基础算法
时间复杂度
时间复杂度用于衡量算法执行服从,它描述了算法运行时间随输入规模增长的变革趋势。在蓝桥杯里,预估算法时间复杂度能避免超时错误。
例如,若标题输入规模 n 达到 (10^5),而你设计的算法时间复杂度为 (O(n^2)),那可能就会超时,由于当 n 较大时,(n^2) 的计算量会急剧增加。此时就需要思量时间复杂度更低的算法,像 (O(n log n)) 或 (O(n)) 的算法。
枚举
枚举就是逐个尝试全部可能的解,直到找到符合条件的解。这种方法简朴直接,但服从可能不高,适合数据规模较小的标题。
示例标题:找出 1 到 100 中全部能被 3 整除的数。
- for i in range(1, 101):
- if i % 3 == 0:
- print(i)
复制代码 在蓝桥杯里,对于一些组合标题、排列标题,若数据规模不大,就可以用枚举法来找出全部可能的情况。
模拟
模拟是按照标题描述的规则,一步一步地模拟标题的执行过程,从而得到终极结果。
示例标题:模拟一个时钟的运转,计算从某个时候开始颠末一段时间后的时候。
- # 初始时刻,小时和分钟
- start_hour = 10
- start_minute = 30
- # 经过的分钟数
- elapsed_minutes = 90
-
- total_minutes = start_hour * 60 + start_minute + elapsed_minutes
- new_hour = (total_minutes // 60) % 24
- new_minute = total_minutes % 60
-
- print(f"新的时刻是: {new_hour}:{new_minute}")
复制代码 蓝桥杯中有很多游戏类、过程模拟类的标题,都可以通过模拟来解决。
递归
递归是函数调用自身的编程本事,它把一个大标题分解成相似的小标题。递归通常包含递归终止条件和递归调用两部分。
示例标题:计算阶乘。
- def factorial(n):
- if n == 0 or n == 1:
- return 1
- return n * factorial(n - 1)
-
- print(factorial(5))
复制代码 在蓝桥杯里,递归可用于解决树、图的遍历标题,以及一些具有递归性质的组合、排列标题。
进制转换
进制转换就是在差别进制之间进行数据转换,常见的有二进制、十进制、八进制和十六进制之间的转换。
示例标题:将十进制数转换为二进制数。
- decimal_num = 10
- binary_num = bin(decimal_num).replace("0b", "")
- print(binary_num)
复制代码 在蓝桥杯的标题中,进制转换可能会出现在数据处理处罚、编码解码等标题里。
前缀和
前缀和是一种预处理处罚技能,能快速计算数组中任意区间的和。通过预先计算前缀和数组,就可以在 (O(1)) 的时间复杂度内得到任意区间的和。
示例标题:计算数组中任意区间的和。
- arr = [1, 2, 3, 4, 5]
- prefix_sum = [0] * (len(arr) + 1)
- for i in range(1, len(arr) + 1):
- prefix_sum[i] = prefix_sum[i - 1] + arr[i - 1]
-
- # 计算区间 [1, 3] 的和(索引从 0 开始)
- left = 1
- right = 3
- sum_range = prefix_sum[right + 1] - prefix_sum[left]
- print(sum_range)
复制代码 在蓝桥杯的区间求和标题中,前缀和能显著提高算法服从。
差分
差分是前缀和的逆运算,它可以快速对数组的某个区间进行修改。通过构建差分数组,对区间的修改可以在 (O(1)) 的时间复杂度内完成,末了再通过差分数组还原出原数组。
示例标题:对数组的某个区间进行加 1 利用。
- arr = [1, 2, 3, 4, 5]
- diff = [0] * len(arr)
- diff[0] = arr[0]
- for i in range(1, len(arr)):
- diff[i] = arr[i] - arr[i - 1]
-
- # 对区间 [1, 3] 进行加 1 操作(索引从 0 开始)
- left = 1
- right = 3
- diff[left] += 1
- if right + 1 < len(diff):
- diff[right + 1] -= 1
-
- new_arr = [0] * len(arr)
- new_arr[0] = diff[0]
- for i in range(1, len(arr)):
- new_arr[i] = new_arr[i - 1] + diff[i]
-
- print(new_arr)
复制代码 在蓝桥杯的区间修改标题中,差分是一个很有用的方法。
离散化
离散化是把无限空间中的有限个体映射到有限的空间中,这样可以降低标题的复杂度。
示例标题:有一组数据 [100, 200, 300, 100, 200],要对其进行离散化处理处罚。
- arr = [100, 200, 300, 100, 200]
- unique_arr = sorted(set(arr))
- discretized_arr = [unique_arr.index(x) for x in arr]
- print(discretized_arr)
复制代码 在蓝桥杯的一些涉及范围、区间的标题中,若数据范围很大但数据量较小,就可以使用离散化来处理处罚。
贪心
贪心算法是在每一步选择中都接纳当前状态下最优的选择,盼望通过局部最优达到全局最优。
示例标题:找零钱标题,用最少的硬币凑出给定的金额。
- coins = [25, 10, 5, 1]
- amount = 63
- coin_count = 0
- for coin in coins:
- coin_count += amount // coin
- amount %= coin
- print(coin_count)
复制代码 在蓝桥杯里,贪心算法实用于一些具有贪心选择性质和最优子布局性质的标题。
双指针
双指针是指使用两个指针在数组或链表上进行遍历,通过移动指针的位置来解决标题。
示例标题:在有序数组中找出两个数,使它们的和即是目标值。
- arr = [1, 2, 3, 4, 5]
- target = 6
- left = 0
- right = len(arr) - 1
- while left < right:
- current_sum = arr[left] + arr[right]
- if current_sum == target:
- print(arr[left], arr[right])
- break
- elif current_sum < target:
- left += 1
- else:
- right -= 1
复制代码 在蓝桥杯的数组、链表干系标题中,双指针能有用降低时间复杂度。
二分
二分查找是在有序数组中查找目标值的高效算法,它的时间复杂度为 (O(log n))。
示例标题:在有序数组中查找目标值的位置。
- arr = [1, 2, 3, 4, 5]
- target = 3
- left = 0
- right = len(arr) - 1
- while left <= right:
- mid = (left + right) // 2
- if arr[mid] == target:
- print(mid)
- break
- elif arr[mid] < target:
- left = mid + 1
- else:
- right = mid - 1
复制代码 在蓝桥杯的查找标题、最值标题中,若数据是有序的,二分查找可以快速找到答案。
构造
构造是根据标题要求,通过一定的方法构造出满意条件的解。
示例标题:构造一个长度为 n 的数组,使得数组中任意两个相邻元素的和都为奇数。
- n = 5
- arr = [1 if i % 2 == 0 else 2 for i in range(n)]
- print(arr)
复制代码 在蓝桥杯里,构造类标题通常需要根据标题的特点和束缚条件,创造性地构造出符合要求的解。
位运算
位运算是对二进制位进行利用,常见的位运算有与(&)、或(|)、异或(^)、取反(~)、左移(<<)和右移(>>)。
示例标题:判断一个数是否为 2 的幂次方。
- num = 8
- if num > 0 and (num & (num - 1)) == 0:
- print("是 2 的幂次方")
- else:
- print("不是 2 的幂次方")
复制代码
在蓝桥杯的一些数据处理处罚、状态压缩等标题中,位运算能提高算法的服从。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |