代码随想录算法训练营day28|复原IP地址、子集、子集Ⅱ

2023.4.11 复原IP地址

93. 复原 IP 地址 - 力扣(LeetCode)

也是进行切割操作。思考一下终止条件:我们的切割位到达了字符串末尾。同时还有一些小要求,即每个小子串处于0-255之间,如果超过一位的话,不能由0开头。

同时,回溯的时候也需要控制我们的删除区域。

class Solution {
    List<String> res = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    int splitTimes = 0;
    public List<String> restoreIpAddresses(String s) {
        backTracking(s,0);
        return res;
    }
    public void backTracking(String s,int start){
        if(start == s.length() && splitTimes == 4){
            res.add(sb.toString());
            return;
        }
        else if(start == s.length() || splitTimes == 4){
            return;
        }
        for(int i = start;i<s.length() && i - start <=2;i++){
            String str = s.substring(start,i+1);
            //检查str是否符合要求。
            if(Integer.parseInt(str)> 255){//不能大于255
                break;
            }
            if(str.length() > 1 && str.charAt(0) == '0'){//不能有前导0
                break;
            }
            
            sb.append(str);
            if(splitTimes < 3){
            sb.append(".");
            }
            splitTimes++;
            //进入递归
            backTracking(s,i+1);
            //回溯
            splitTimes--;
            sb.delete(start + splitTimes,i+splitTimes+2);  
        }
    }
}

2023.4.11 子集

78. 子集 - 力扣(LeetCode)

如何确定终止条件?不需要终止条件!因为子集需要我们遍历整个节点,而之前的求组合之所以有终止条件是因为我们需要求得是叶子结点。

这个子集就是标准的回溯模板

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> subsets(int[] nums) {
    backTracking(nums,0);
    return res;
    }
    public void backTracking(int[] nums,int start){
        res.add(new ArrayList(path));
        for(int i = start;i<nums.length;i++){
            path.add(nums[i]);
            backTracking(nums,i+1);
            path.removeLast();
        }
    }
}

2023.4.11 子集Ⅱ

90. 子集 II - 力扣(LeetCode)

排序后去重操作,和们之前的数组总和Ⅱ有点类似。

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        backTracking(nums,0);
        return res;
    }
    public void backTracking(int[] nums,int start){
        res.add(new ArrayList(path));
        for(int i = start;i<nums.length;i++){
            if( i>start && nums[i] == nums[i-1]){//去重操作,同一层不能有重复的数字。否则会出现相同的结果
            continue;
            }
        path.add(nums[i]);
        backTracking(nums,i+1);
        path.removeLast();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Python代码示例,展示如何使用遗传算法选取最优特征子集训练rbf核分类SVM: ```python import numpy as np from sklearn.svm import SVC from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split # 加载乳腺癌数据集 data = load_breast_cancer() X, y = data.data, data.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 定义遗传算法的参数 pop_size = 50 generations = 100 mutation_rate = 0.1 # 定义特征向量的维度 n_features = X_train.shape[1] # 随机生成初始种群 population = np.random.randint(2, size=(pop_size, n_features)) # 遗传算法的主循环 for i in range(generations): # 计算每个个体的适应度值 fitness = np.zeros(pop_size) for j in range(pop_size): selected_features = np.where(population[j] == 1)[0] if len(selected_features) > 0: clf = SVC(kernel='rbf') clf.fit(X_train[:, selected_features], y_train) fitness[j] = clf.score(X_test[:, selected_features], y_test) # 选择操作 selected_indices = np.random.choice(pop_size, size=pop_size//2, replace=False, p=fitness/np.sum(fitness)) selected_population = population[selected_indices] # 交叉操作 crossover_population = np.zeros_like(selected_population) for j in range(0, len(selected_indices), 2): crossover_point = np.random.randint(n_features) crossover_population[j][:crossover_point] = selected_population[j][:crossover_point] crossover_population[j][crossover_point:] = selected_population[j+1][crossover_point:] crossover_population[j+1][:crossover_point] = selected_population[j+1][:crossover_point] crossover_population[j+1][crossover_point:] = selected_population[j][crossover_point:] # 变异操作 mutation_population = crossover_population for j in range(len(crossover_population)): if np.random.rand() < mutation_rate: mutation_population[j][np.random.randint(n_features)] = 1 - mutation_population[j][np.random.randint(n_features)] # 更新种群 population = mutation_population # 找到最优的特征子集 best_individual = None best_fitness = 0 for j in range(pop_size): selected_features = np.where(population[j] == 1)[0] if len(selected_features) > 0: clf = SVC(kernel='rbf') clf.fit(X_train[:, selected_features], y_train) current_fitness = clf.score(X_test[:, selected_features], y_test) if current_fitness > best_fitness: best_individual = selected_features best_fitness = current_fitness # 输出最优的特征子集和对应的分类准确率 print('Best individual:', best_individual) print('Best fitness:', best_fitness) ``` 这个代码示例中,我们使用`load_breast_cancer()`函数加载了一个乳腺癌数据集,然后将数据集划分为训练集和测试集。接着,我们定义了遗传算法的参数,随机生成了初始种群,并在遗传算法的主循环中进行了选择、交叉、变异等操作。每个个体的适应度值是通过训练rbf核SVM并在测试集上评估得到的分类准确率。最后,我们在所有个体中找到了最优的特征子集,并输出了对应的分类准确率。 需要注意的是,这个代码示例仅为演示如何使用遗传算法选取最优特征子集训练rbf核分类SVM,具体应用中需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值