面试会考的动态规划DP总结

这篇博客总结了动态规划DP在面试中的应用,包括Sequence DP、Matrix DP和Two Sequences DP的典型题目,如爬楼梯、编辑距离、最短路径问题等,并详细解释了LCS和LIS的转移方程及初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先挖个坑,今天听了两个小时的DP,深有收获,先把笔记贴在这里。过阵子来整理。。。


1 DP适用的题目:

-求最值 Jump Game II Palindrome Partitioning II Edit Distance Minimum Path Sum Triangle 
-可行不可行  Jump Game Word Break Interleaving String 
-求方案总数 eg: Climbing Stairs Decode Ways  Distinct Subsequences Unique Paths Unique Paths II 

但是如果要求具体每个方案:DFS  eg: Combination Sum Combination Sum II 

2 DP的分类:

Sequence DP

Q1. Climbing Stairs

http://oj.leetcode.com/problems/climbing-stairs/

### 数据分析面试中的常见代码题及解答 数据分析面试中常见的代码题通常围绕数据预处理、特征工程、模型实现以及优化等方面展开。以下是几类典型的代码题及其解答: #### 1. 大规模数据处理 对于大规模数据(如超过内存容量的数据集),如何有效地对其进行分割和处理是一个重要考点。 ```python import hashlib def hash_partition(file_path, output_dir, num_partitions=1000): """ 使用哈希函数将大文件按行分区到多个子文件中。 :param file_path: 输入的大文件路径 :param output_dir: 输出目录 :param num_partitions: 分区数量,默认为1000 """ partition_files = {i: open(f"{output_dir}/part_{i}.txt", 'w') for i in range(num_partitions)} with open(file_path, 'r') as f: for line in f: # 计算每行的哈希值并映射到对应的分区 hash_value = int(hashlib.md5(line.encode()).hexdigest(), 16) % num_partitions partition_files[hash_value].write(line) for pf in partition_files.values(): pf.close() ``` 此方法利用哈希函数将大数据集划分为若干个小部分,便于后续逐块加载到内存中进行计算[^4]。 --- #### 2. 缺失值填充 缺失值是实际业务场景中最常遇到的问题之一,合理填补这些缺失值能够提升模型性能。 ```python import pandas as pd import numpy as np def fill_missing_values(df, strategy='mean'): """ 基于指定策略填充DataFrame中的缺失值。 :param df: 输入的Pandas DataFrame :param strategy: 填充策略 ('mean', 'median', 'mode') """ strategies = { 'mean': lambda col: col.mean(), 'median': lambda col: col.median(), 'mode': lambda col: col.mode()[0], } if strategy not in strategies: raise ValueError("Unsupported filling strategy.") filled_df = df.copy() for column in df.columns: if df[column].isnull().any(): # 如果列中有缺失值 filler = strategies[strategy](df[column]) filled_df[column] = df[column].fillna(filler) return filled_df ``` 该函数支持多种填充方式,可以根据具体需求灵活调整[^3]。 --- #### 3. 特征编码 类别型变量需要转换成数值形式才能被机器学习算法接受,常用的编码技术包括独热编码(One-Hot Encoding)和标签编码(Label Encoding)。 ```python from sklearn.preprocessing import OneHotEncoder, LabelEncoder def encode_categorical_features(df, categorical_cols=None, encoding_type='one_hot'): """ 对分类变量进行编码。 :param df: 输入的Pandas DataFrame :param categorical_cols: 需要编码的列名列表 :param encoding_type: 编码类型 ('label' 或 'one_hot') """ if categorical_cols is None or len(categorical_cols) == 0: categorical_cols = df.select_dtypes(include=['object']).columns encoded_df = df.drop(columns=categorical_cols).copy() # 移除原始分类列 if encoding_type == 'label': label_encoders = {} for col in categorical_cols: le = LabelEncoder() encoded_df[col] = le.fit_transform(df[col]) label_encoders[col] = le return encoded_df, label_encoders elif encoding_type == 'one_hot': onehot_encoder = OneHotEncoder(sparse=False) transformed_data = onehot_encoder.fit_transform(df[categorical_cols]) new_columns = [] for i, category_col in enumerate(categorical_cols): categories = onehot_encoder.categories_[i] new_columns.extend([f'{category_col}_{cat}' for cat in categories]) onehot_encoded_df = pd.DataFrame(transformed_data, columns=new_columns) final_df = pd.concat([encoded_df.reset_index(drop=True), onehot_encoded_df], axis=1) return final_df, onehot_encoder else: raise ValueError("Invalid encoding type specified.") ``` 这段代码实现了两种主流的特征编码方案,并返回经过编码后的数据帧以及用于逆变换的对象[^3]。 --- #### 4. 排序与去重操作 在某些情况下,我们需要对数据按照特定字段排序或者去除重复项。 ```python def sort_and_drop_duplicates(df, sort_by_column, ascending=True, keep_first=True): """ 按照某列排序并对整个表执行去重操作。 :param df: 输入的Pandas DataFrame :param sort_by_column: 排序列名称 :param ascending: 是否升序排列 :param keep_first: 去重时保留第一个出现还是最后一个 (True 表示前者 False 后者) """ sorted_df = df.sort_values(by=sort_by_column, ascending=ascending) deduplicated_df = sorted_df.drop_duplicates(keep='first' if keep_first else 'last') return deduplicated_df ``` 通过调用 `drop_duplicates` 方法可以轻松完成这一任务,同时还能控制保留哪条记录作为唯一代表。 --- #### 5. 文本向量化 自然语言处理领域经常需要用到词袋模型或其他高级表示法来捕捉文本信息。 ```python from sklearn.feature_extraction.text import TfidfVectorizer def vectorize_text(corpus, max_features=1000, ngram_range=(1, 1)): """ 将文本语料库转化为TF-IDF矩阵。 :param corpus: 列表形式存储的一组字符串样本 :param max_features: 控制最大特征数目 :param ngram_range: N-Gram范围设置 """ tfidf_vectorizer = TfidfVectorizer(max_features=max_features, ngram_range=ngram_range) X_tfidf = tfidf_vectorizer.fit_transform(corpus) feature_names = tfidf_vectorizer.get_feature_names_out() return X_tfidf.toarray(), feature_names ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值