416. Partition Equal Subset Sum

探讨如何判断一个正整数数组是否可以分为两个子集,使两子集元素之和相等。介绍两种方法:深度优先搜索(DFS)及动态规划(DP)。最终采用DP实现,通过构建二维布尔数组解决此问题。

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

Note:

  1. Each of the array element will not exceed 100.
  2. The array size will not exceed 200.

 

Example 1:

Input: [1, 5, 11, 5]

Output: true

Explanation: The array can be partitioned as [1, 5, 5] and [11].

 

Example 2:

Input: [1, 2, 3, 5]

Output: false

Explanation: The array cannot be partitioned into equal sum subsets.

这道题可以说非常好,我想到两种方法,第一种是dfs,current sum==target sum就return True,否则for i in range(len(nums)),每次选一个num[i]加到current sum里,然后nums变为nums[:i]+nums[i+1:],进行递归。

可惜啊,这方法超时了。

于是乎,咱们直接上dp。说到dp这题是subset sum的变种题。

图表:

横坐标是amount也就是target sum,纵坐标是nums,dp规则见代码。就这样~

class Solution(object):
    def canPartition(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        totalsum=sum(nums)
        if totalsum%2:
            return False
        targetsum=totalsum/2
        
        mem=[[False for _ in range(targetsum+1)] for _ in range(len(nums))]
        for r in range(len(nums)):
            mem[r][0]=True
        
        for r in range(len(nums)):
            for c in range(1,targetsum+1):
                if nums[r]>c:
                    mem[r][c]=mem[r-1][c]
                else:
                    if mem[r-1][c]:
                        mem[r][c]=True
                    else:
                        mem[r][c]=mem[r-1][c-nums[r]]
        
        return mem[-1][-1]
        

 

下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
# %% [markdown] # ## 光纤异常检测系统(Jupyter优化版) # %% [markdown] # ### 1. 环境准备 # %% # 安装必要库(如果尚未安装) # !pip install pandas numpy scikit-learn matplotlib import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from collections import defaultdict import time import matplotlib.pyplot as plt # %% [markdown] # ### 2. 数据加载模块 # %% def load_otdr_data(path): """优化版数据加载,自动生成示例数据""" try: df = pd.read_csv(path) except FileNotFoundError: print(f"未找到文件 {path},生成示例数据...") np.random.seed(42) data = { 'SNR': np.random.uniform(20, 40, 1000), 'Position': np.random.randint(0, 100000, 1000), } for i in range(1,31): data[f'P{i}'] = np.random.normal(i*0.1, 1, 1000) df = pd.DataFrame(data) df.iloc[::50, 5:] += np.random.normal(5, 1, (20,25)) # 添加异常模式 # 添加特征权重标记 waveform_features = [f'P{i}' for i in range(1,31)] return df[['SNR', 'Position'] + waveform_features], waveform_features # %% [markdown] # ### 3. 增强型贝叶斯分区模型 # %% class JupyterBayesianPartitioner: def __init__(self, m_partitions=8, alpha=1e-4, feature_weights=None): self.m = m_partitions self.alpha = alpha self.feature_weights = feature_weights or {f'P{i}':1.0 for i in range(1,31)} self.partition_probs = defaultdict(float) self.feature_probs = defaultdict(dict) self.scaler = StandardScaler() def _create_partitions(self, data): """可视化分区过程""" if data.ndim == 1: data = data.reshape(1, -1) bins = np.percentile(data, np.linspace(0, 100, self.m + 1)) counts, _ = np.histogram(data, bins=bins) # 显示分区可视化 if not hasattr(self, '_shown_viz'): plt.figure(figsize=(10,4)) plt.title(f"Feature Partition Visualization (m={self.m})") for i in range(data.shape[1]): plt.hist(data[:,i], bins=bins, alpha=0.3) plt.show() self._shown_viz = True return counts def _apply_weights(self, sample): return [sample[i] * self.feature_weights.get(f'P{i+1}',1.0) for i in range(len(sample))] def fit(self, X): """带进度显示的训练过程""" from IPython.display import clear_output # 特征加权 X_weighted = np.array([self._apply_weights(x) for x in X]) # 数据标准化 self.scaler.fit(X_weighted) scaled = self.scaler.transform(X_weighted) # 分区统计 partition_counts = defaultdict(int) for i, sample in enumerate(scaled): partition = tuple(self._create_partitions(sample)) partition_counts[partition] += 1 # 显示进度 if i % 100 == 0: clear_output(wait=True) print(f"Training: {i+1}/{len(X)} samples processed") # 计算先验概率 total = len(X) for k, count in partition_counts.items(): self.partition_probs[k] = (count + self.alpha) / (total + self.alpha * len(partition_counts)) # 特征概率计算 for idx, (partition, p_k) in enumerate(self.partition_probs.items()): mask = np.array([np.array_equal(self._create_partitions(x), partition) for x in scaled]) subset = scaled[mask] stats = { 'mean': subset.mean(axis=1), 'std': subset.std(axis=1), 'range': np.ptp(subset, axis=1), 'wavelet': np.sum(np.abs(np.diff(subset))**2, axis=1) } self.feature_probs[partition] = { feat: (np.histogram(vals, bins=20, density=True)[0] + self.alpha) for feat, vals in stats.items() } clear_output(wait=True) print(f"Processing partitions: {idx+1}/{len(self.partition_probs)}") # %% [markdown] from IPython.display import clear_output # 添加此行以导入 clear_output def jupyter_detect_anomalies(data_path, config): """交互式检测流程""" # 初始化 start_time = time.time() plt.figure(figsize=(10,3)) # 动态配置 feature_weights = {f'P{i}':1.0 for i in range(1,31)} for i in range(25,31): feature_weights[f'P{i}'] = config['tail_weight'] # 加载数据 raw_data, features = load_otdr_data(data_path) print(f"数据加载完成,样本数: {len(raw_data)}") # 模型训练 model = JupyterBayesianPartitioner( m_partitions=config['m_partitions'], feature_weights=feature_weights ) model.fit(raw_data[features].values) # 异常评分 scores = [] for i, row in raw_data.iterrows(): score = 1 - model.partition_probs.get( tuple(model._create_partitions(model.scaler.transform( [model._apply_weights(row[features].values)] )[0])), 0) scores.append(score) if i % 100 == 0: plt.clf() plt.plot(scores, alpha=0.7) plt.title('Real-time Anomaly Scores') plt.xlabel('Sample Index') plt.ylabel('Score') display(plt.gcf()) clear_output(wait=True) # 清除输出 raw_data['Anomaly_Score'] = scores q75 = np.percentile(scores, 75) raw_data['Anomaly_Score'] = np.clip((raw_data.Anomaly_Score - q75)/(1 - q75), 0, 1) raw_data['Is_Anomaly'] = raw_data.Anomaly_Score > config['threshold'] # 结果分析 print(f"\n检测完成! 耗时: {time.time()-start_time:.2f}s") print(f"异常阈值: {config['threshold']} | 尾部特征权重: {config['tail_weight']}x") print(f"异常样本占比: {raw_data.Is_Anomaly.mean():.2%}") # 可视化 fig, ax = plt.subplots(2,1,figsize=(12,6)) ax[0].hist(raw_data.Anomaly_Score, bins=20) ax[0].set_title('Anomaly Score Distribution') ax[1].scatter(raw_data.Position, raw_data.SNR, c=raw_data.Anomaly_Score, cmap='Reds') ax[1].set_title('Geographical Distribution') plt.tight_layout() plt.show() return raw_data # %% [markdown] # ### 5. 执行检测(带交互控件) # %% # 配置参数(可通过Jupyter widgets调整) config = { 'm_partitions': 8, 'threshold': 0.65, 'tail_weight': 1.5, 'data_path': 'D://SF//YBSJ//OTDR_data1.csv' # 可替换为真实数据路径 } # 执行检测 results = jupyter_detect_anomalies(config['data_path'], config) # 显示结果 display(results[['SNR', 'Position', 'Anomaly_Score']].head(10)) print("\n异常位置统计:") print(results[results.Is_Anomaly].Position.describe()) 最后不需要生成图片,只要生成文字和csv文件就好
05-24
为了实现仅生成文字输出和CSV文件而不生成图片,可以移除代码中与绘图相关的部分。以下是修改后的代码: ```python import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from collections import defaultdict import time def load_otdr_data(path): """优化版数据加载,自动生成示例数据""" try: df = pd.read_csv(path) except FileNotFoundError: print(f"未找到文件 {path},生成示例数据...") np.random.seed(42) data = { 'SNR': np.random.uniform(20, 40, 1000), 'Position': np.random.randint(0, 100000, 1000), } for i in range(1,31): data[f'P{i}'] = np.random.normal(i*0.1, 1, 1000) df = pd.DataFrame(data) df.iloc[::50, 5:] += np.random.normal(5, 1, (20,25)) # 添加异常模式 waveform_features = [f'P{i}' for i in range(1,31)] return df[['SNR', 'Position'] + waveform_features], waveform_features class JupyterBayesianPartitioner: def __init__(self, m_partitions=8, alpha=1e-4, feature_weights=None): self.m = m_partitions self.alpha = alpha self.feature_weights = feature_weights or {f'P{i}':1.0 for i in range(1,31)} self.partition_probs = defaultdict(float) self.scaler = StandardScaler() def _create_partitions(self, data): if data.ndim == 1: data = data.reshape(1, -1) bins = np.percentile(data, np.linspace(0, 100, self.m + 1)) counts, _ = np.histogram(data, bins=bins) return counts def _apply_weights(self, sample): return [sample[i] * self.feature_weights.get(f'P{i+1}',1.0) for i in range(len(sample))] def fit(self, X): from IPython.display import clear_output X_weighted = np.array([self._apply_weights(x) for x in X]) self.scaler.fit(X_weighted) scaled = self.scaler.transform(X_weighted) partition_counts = defaultdict(int) for i, sample in enumerate(scaled): partition = tuple(self._create_partitions(sample)) partition_counts[partition] += 1 if i % 100 == 0: clear_output(wait=True) print(f"Training: {i+1}/{len(X)} samples processed") total = len(X) for k, count in partition_counts.items(): self.partition_probs[k] = (count + self.alpha) / (total + self.alpha * len(partition_counts)) def jupyter_detect_anomalies(data_path, config): """交互式检测流程(无图形输出)""" start_time = time.time() feature_weights = {f'P{i}':1.0 for i in range(1,31)} for i in range(25,31): feature_weights[f'P{i}'] = config['tail_weight'] raw_data, features = load_otdr_data(data_path) print(f"数据加载完成,样本数: {len(raw_data)}") model = JupyterBayesianPartitioner( m_partitions=config['m_partitions'], feature_weights=feature_weights ) model.fit(raw_data[features].values) scores = [] for i, row in raw_data.iterrows(): score = 1 - model.partition_probs.get( tuple(model._create_partitions(model.scaler.transform( [model._apply_weights(row[features].values)] )[0])), 0) scores.append(score) raw_data['Anomaly_Score'] = scores q75 = np.percentile(scores, 75) raw_data['Anomaly_Score'] = np.clip((raw_data.Anomaly_Score - q75)/(1 - q75), 0, 1) raw_data['Is_Anomaly'] = raw_data.Anomaly_Score > config['threshold'] print(f"\n检测完成! 耗时: {time.time()-start_time:.2f}s") print(f"异常阈值: {config['threshold']} | 尾部特征权重: {config['tail_weight']}x") print(f"异常样本占比: {raw_data.Is_Anomaly.mean():.2%}") # 输出结果到CSV文件 output_path = "anomaly_results.csv" raw_data.to_csv(output_path, index=False) print(f"结果已保存至: {output_path}") return raw_data # 配置参数 config = { 'm_partitions': 8, 'threshold': 0.65, 'tail_weight': 1.5, 'data_path': 'D://SF//YBSJ//OTDR_data1.csv' } # 执行检测 results = jupyter_detect_anomalies(config['data_path'], config) # 显示结果 print("\n前10行结果:") print(results[['SNR', 'Position', 'Anomaly_Score']].head(10)) print("\n异常位置统计:") print(results[results.Is_Anomaly].Position.describe()) ``` ### 解释 1. **移除绘图代码**:删除了所有与`matplotlib`相关的绘图代码。 2. **添加CSV输出**:在检测完成后,将结果保存为CSV文件,并打印文件路径。 3. **保留文字输出**:保留了关键的统计信息和进度提示。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值