【hot100篇-python刷题记录】【滑动窗口最大值】

R6-子串篇

目录

Max

Sort

单调队列法:

Max

完了,我好像想到python的max

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        ret=[]
        left,right=0,k
        while right<=len(nums):
            ret.append(max(nums[left:right]))
            right+=1
            left+=1
        return ret

 居然超时

分析一下时间复杂度

外层循环的次数:外层循环会遍历整个数组 nums,每次增加 left 指针。循环的次数是 len(nums) - k + 1,因为当 left 到达 len(nums) - k 时,窗口的右边界 right 将是 len(nums),这是窗口能滑动的最后一个位置。
内层 max 函数的调用:在每次外层循环中,max 函数会被调用,以找到当前窗口中的最大值。由于窗口的大小是固定的 k,因此每次调用 max 函数的时间复杂度是 O(k)。
结合这两个方面,我们可以得到以下的时间复杂度:

外层循环的次数是 len(nums) - k + 1,每次循环中,我们调用 max 函数,其时间复杂度是 O(k)。因此,总的时间复杂度是:

O((len(nums) - k + 1) * k)

这可以简化为:

O((n - k + 1) * k)

其中 n 是数组 nums 的长度。

如果 k 相对于 n 来说是常数,那么时间复杂度可以进一步简化为:

O(n * k)

这是因为 k 被视为常数,因此可以忽略。

综上所述,给定代码的时间复杂度是 O(n * k)。

Sort

还想用sort蒙混过关哈哈哈

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        ret=[]
        left,right=0,k
        while right<=len(nums):
            sort_nums=sorted(nums[left:right])
            ret.append(sort_nums[-1])
            right+=1
            left+=1
        return ret

 一样超时

只能尽可能少的-地在内层循环中搜索值

我也这样想过

这个题解解决了现有的问题

本题难点:怎么将内层的查找最大值,O(k)压缩至O(1)

单调队列法:

直接看代码吧

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        #创建队列
        deque=collections.deque()
        ret,n=[],len(nums)
        for i,j in zip(range(1-k,n+1-k),range(n)):
            #删除deque中对应的nums[i-1]
            if i>0 and deque[0]==nums[i-1]:
                deque.popleft()
            #保持deque递减
            while deque and deque[-1]<nums[j]:
                deque.pop()
            deque.append(nums[j])
            #记录窗口最大值
            if i>=0:
                ret.append(deque[0])
        return ret

真的太强了,get到单调栈! 

在进行数据分析和建模之前,数据预处理是必不可少的步骤。本文将介绍常见的数据预处理方法,以及如何用Python实现它们。 ## 缺失值处理 在实际数据中,经常会出现缺失值。这些缺失值可能是由于数据采集过程中的问题,或者是由于某些数据不可用或丢失。在分析过程中,缺失值会影响模型的准确性,因此需要进行处理。 ### 1. 删除缺失值 一种简单的方法是删除包含缺失值的行或列。这种方法简单、直接,但也可能会导致数据丢失过多。 ```python # 删除包含缺失值的行 df.dropna(inplace=True) # 删除包含缺失值的列 df.dropna(axis=1, inplace=True) ``` ### 2. 填充缺失值 另一种方法是用其他值填充缺失值。常见的填充方法包括: - 用平均值、中位数或众数填充 - 用前一个或后一个非缺失值填充 - 用插值法填充(比如线性插值、多项式插值等) ```python # 用平均值填充缺失值 df.fillna(df.mean(), inplace=True) # 用前一个非缺失值填充缺失值 df.fillna(method='ffill', inplace=True) # 用插值法填充缺失值 df.interpolate(inplace=True) ``` ## 异常值处理 异常值是指与其它数据极为不同的数据点。异常值可能是由于数据采集过程中的错误或异常,或者是由于真实的异常情况。在分析过程中,异常值会影响模型的准确性,因此需要进行处理。 ### 1. 删除异常值 一种简单的方法是删除包含异常值的行或列。这种方法可能会导致数据丢失过多。 ```python # 删除包含异常值的行 df = df[df['column'] < threshold] # 删除包含异常值的列 df.drop('column', axis=1, inplace=True) ``` ### 2. 替换异常值 另一种方法是用其他值替换异常值。常见的替换方法包括: - 用平均值、中位数或众数替换 - 用前一个或后一个非异常值替换 - 用插值法替换(比如线性插值、多项式插值等) ```python # 用中位数替换异常值 median = df['column'].median() df.loc[df['column'] > threshold, 'column'] = median # 用前一个非异常值替换异常值 df.loc[df['column'] > threshold, 'column'] = df.loc[df['column'] < threshold, 'column'].iloc[-1] # 用插值法替换异常值 df['column'] = df['column'].interpolate() ``` ## 数据标准化 在进行数据分析和建模之前,通常需要对数据进行标准化。标准化可以将不同变量的取值范围统一,避免因为变量取值范围不同而导致的模型偏差。 常见的标准化方法包括: - Z-score标准化 - 最小-最大标准化 - 小数定标标准化 ```python # Z-score标准化 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() df['column'] = scaler.fit_transform(df[['column']]) # 最小-最大标准化 from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() df['column'] = scaler.fit_transform(df[['column']]) # 小数定标标准化 df['column'] = df['column'] / 10**np.ceil(np.log10(df['column'].abs().max())) ``` ## 数据编码 在进行数据分析和建模之前,通常需要对非数值型数据进行编码。编码可以将非数值型数据转换成数值型数据,方便模型进行计算。 常见的编码方法包括: - one-hot编码 - 标签编码 ```python # one-hot编码 from sklearn.preprocessing import OneHotEncoder encoder = OneHotEncoder() encoded = encoder.fit_transform(df[['column']]) df_encoded = pd.DataFrame(encoded.toarray(), columns=encoder.get_feature_names(['column'])) # 标签编码 from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder() df['column'] = encoder.fit_transform(df['column']) ``` ## 特征选择 在进行数据分析和建模之前,通常需要对特征进行选择。特征选择可以帮助我们选择最重要的特征,避免因为特征过多而导致的过拟合问题。 常见的特征选择方法包括: - 方差选择法 - 相关系数法 - 卡方检验法 - 互信息法 - 基于模型的选择法 ```python # 方差选择法 from sklearn.feature_selection import VarianceThreshold selector = VarianceThreshold(threshold=0.1) df_selected = selector.fit_transform(df) # 相关系数法 from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr selector = SelectKBest(score_func=pearsonr, k=5) df_selected = selector.fit_transform(df, target) # 卡方检验法 from sklearn.feature_selection import chi2 selector = SelectKBest(score_func=chi2, k=5) df_selected = selector.fit_transform(df, target) # 互信息法 from sklearn.feature_selection import mutual_info_classif selector = SelectKBest(score_func=mutual_info_classif, k=5) df_selected = selector.fit_transform(df, target) # 基于模型的选择法 from sklearn.feature_selection import SelectFromModel from sklearn.linear_model import LogisticRegression selector = SelectFromModel(LogisticRegression(penalty='l1', C=0.1)) df_selected = selector.fit_transform(df, target) ``` 以上就是常见的数据预处理方法和Python实现方式。在实际分析和建模中,我们需要根据具体情况选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值