【ACM】—蓝桥杯大一暑期集训Day2
发布人:shili8
发布时间:2024-12-11 08:33
阅读次数:0
**ACM — 蓝桥杯大一暑期集训 Day2**
### **一、前言**
在前一天的基础上,我们继续深入地探索算法设计和实现。今天我们将讨论以下几个主题:
* **二分查找**
* **滑动窗口**
* **回溯算法**
这些主题对于提高算法解决能力至关重要。
### **二、二分查找**
二分查找是一种常见的算法,用于在一个有序列表中找到某个元素。它通过不断地将列表分成两半来实现。
#### **2.1 二分查找算法**
def binary_search(arr, target): left, right =0, len(arr) -1 while left <= right: mid = (left + right) //2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid +1 else: right = mid -1 return -1# 示例使用arr = [1,3,5,7,9] target =5index = binary_search(arr, target) if index != -1: print(f"元素 {target} 在列表中找到,索引为 {index}") else: print(f"元素 {target} 不在列表中")
#### **2.2 二分查找的时间复杂度**
二分查找的时间复杂度为 O(log n),其中 n 是列表中的元素数量。这是因为每次比较都将列表缩小一半。
### **三、滑动窗口**
滑动窗口是一种常见的算法,用于在一个序列中找到某个模式或子串。它通过不断地移动窗口来实现。
#### **3.1 滑动窗口算法**
def sliding_window(arr, window_size): for i in range(len(arr) - window_size +1): window = arr[i:i + window_size] # 在此处添加检查窗口的逻辑 print(f"当前窗口:{window}") # 示例使用arr = [1,2,3,4,5,6,7,8,9] window_size =3sliding_window(arr, window_size)
#### **3.2 滑动窗口的时间复杂度**
滑动窗口的时间复杂度为 O(n),其中 n 是序列中的元素数量。这是因为每次移动窗口都需要检查所有元素。
### **四、回溯算法**
回溯算法是一种常见的算法,用于在一个集合中找到某个子集或排列。它通过不断地尝试和错误来实现。
#### **4.1 回溯算法**
def backtrack(arr, target): def recursive_backtrack(arr, target, current_combination): if len(current_combination) == target: result.append(current_combination[:]) return for i in range(len(arr)): if arr[i] not in current_combination: current_combination.append(arr[i]) recursive_backtrack(arr, target, current_combination) current_combination.pop() result = [] recursive_backtrack(arr, target, []) return result# 示例使用arr = [1,2,3] target =2result = backtrack(arr, target) print(result)
#### **4.2 回溯算法的时间复杂度**
回溯算法的时间复杂度为 O(n^r),其中 n 是集合中的元素数量,r 是目标子集或排列的大小。这是因为每次尝试都需要检查所有可能的组合。
### **五、结论**
在本文中,我们讨论了二分查找、滑动窗口和回溯算法这三个重要的算法主题。这些算法对于提高算法解决能力至关重要。通过理解这些算法的原理和实现,我们可以更好地解决实际问题。
### **六、参考**
* [ACM — 蓝桥杯大一暑期集训 Day1]( />* [二分查找算法]( />* [滑动窗口算法]( />* [回溯算法](