【hot100篇-python刷题记录】【两数之和】

LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

悲壮的R4-零基础入门篇终于在短暂的休息后告别了,

即将迎来的是重磅重温默写复写思路篇。

R5-哈希篇

一个月了,还是用回了老算法

经典两层遍历

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n=len(nums)
        for i in range(n):
            for j in range(n):
                if i!=j and nums[i]+nums[j]==target:
                    return [i,j]
        return []

 

我得专注于思考一些优化的方法以及优化的原理了,而不是仅仅在于解决问题。

需要用到哈希表

由于哈希表查找为O(1)复杂度,简化两层循环在于找到i和j之间的关联,关联点在于target是和

所以我们可以遍历一层哈希表,key是值,value是下标。

原理相当于将第二层循环简化成查找是否有key2=target-key1

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n=len(nums)
        dict=defaultdict(int)
        #记录下标
        for i in range(n):
            dict[nums[i]]=i
        #遍历
        for i in dict.keys():
            j=target-i
            if i!=j and j in dict.keys():
                return [dict[i],dict[j]]
        #查找不到
        return []

有问题

在第一次遍历记录的时候,如果数组存在相等的两个数,就只会记录最后一个数的下标,这显然不是我们想要的。

所以我们调整,根据下标记录值,保证了不可重复性。

 

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n=len(nums)
        dict=defaultdict(int)
        #记录下标
        for i in range(n):
            dict[i]=nums[i]
        #遍历
        for i in dict.keys():
            for j in dict.keys():
                if i!=j and dict[i]+dict[j]==target:
                    return [i,j]
        #查找不到
        return []

这个版本没有优化成功

优化方法:

不用事先去记录哈希表初始化

在遍历数组的同时,查找target-num1是否在哈希表中即可。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict=defaultdict(int)
        #记录下标
        for i,num in enumerate(nums):
            num2=target-num
            if num2 in dict:
                return [dict[num2],i]
            dict[num]=i
        return []

之所以不会出现上面的案例不通过的情况是,他没有初始化哈希表,所以避免了两个相同值记录下标的问题,由于题目给出对于每个输入只能有一个答案,所以不会出现3个相同的值。 

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在进行数据分析和建模之前,数据预处理是必不可少的步骤。本文将介绍常见的数据预处理方法,以及如何用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、付费专栏及课程。

余额充值