暴搜,回溯,剪枝

news2024/11/28 19:33:04

力扣77.组合

class Solution {
    List<List<Integer>>ret=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
    int n; int k;
    public List<List<Integer>> combine(int _n, int _k) {
        n=_n;
        k=_k;
     dfs(1);
     return ret;
    }
    public void dfs(int pos){
        if(path.size()==k){
            ret.add(new ArrayList<>(path));
            return ;
        }
        //模拟画递归图的时候,有个地方没有思考清楚,就是加入说他刚开始是1,2,那么还会出现一次1,2,我刚开始想
        //这怎么能对呢,明明1,2重复了
        //后来才想到,是回溯想错了,应该是当他回溯的时候,就回到原先的dfs处,所以当他1,2存完之后,他是i还是2
        
        for(int i=pos;i<=n;i++){
            path.add(i);
            dfs(i+1);
            path.remove(path.size()-1);
        }
        }
    }

力扣494.目标和

刚开始我一直在思考一件事,就是我的薄弱代码能力,怎么表示加号和减号

后来发现,其实发现这就是我的思维和编程思维的区别

我的思维总在想把符号添加到数字身上,如何如何,其实编程的思维体现在哪,就是说这种加不加符号,完全可以转化成——运算符的加减法

假如说是加号,那就是两数相加,假如说减号那么就是两数字相减

class Solution {
    int ret;
    int sum;
    int path;
    public int findTargetSumWays(int[] nums, int target) {
    path=target;
    dfs(nums,0);
    return ret;
    }
    public void dfs(int []nums,int pos){
    if(pos==nums.length){
    if(path==sum){
        ret++;
    }
        return ;
    }
    sum+=nums[pos];
    dfs(nums,pos+1);
    sum=sum-nums[pos];

    sum=sum-nums[pos];
    dfs(nums,pos+1);
    sum+=nums[pos];
    }
}

全局变量写成参数的写法(这个时候就不用回溯了,怎么选择使用看自己,代码简洁,就是把记录全部数字当成参数)

class Solution {
    int ret;
    int path;
    public int findTargetSumWays(int[] nums, int target) {
    path=target;
    dfs(nums,0,0);
    return ret;
    }
    public void dfs(int []nums,int pos,int sum){
    if(pos==nums.length){
    if(path==sum){
        ret++;
    }
        return ;
    }
    dfs(nums,pos+1,sum+nums[pos]);
    dfs(nums,pos+1,sum-nums[pos]);
    }
}

力扣39.组合总和

剪枝只需要剪掉这个位置之前的位置即可,从pos开始,剪枝完成

然后递归是递归的下标

class Solution {
    List<List<Integer>>ret=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
    int sum;
    int k;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
        k=target;
        dfs(candidates,0);
        return ret;
    }
public void dfs(int[]candidates,int pos){
    if(sum==k){
        ret.add(new ArrayList<>(path));
        return;
    }
    if(sum>k){
        return;
    }
    //这个操作for是横着走
    for(int i=pos;i<candidates.length;i++){
    sum+=candidates[i];
    path.add(candidates[i]);
    //我们递归之后往下走,我认为传递的值,是为了回溯之后使用,
    //传递i是为了让他可以往下着走,pos相当于是横着的。
    //下一层接着从i位置开始,假如说是pos那么它就会重复的进入一个地点多次,比如进了假如你已经存完了223此时,你回溯之后还是进入23由于pos一直不变,所以你又选了一个2这样就是重复了,我认为他选pos还是i的意义是用来回溯之后看往哪里走的.
    dfs(candidates,i);
    path.remove(path.size()-1);
    sum-=candidates[i];
         }
    }
}

这个是吧sum当成参数而不是全局变量

class Solution {
    List<List<Integer>>ret=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
    int k;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
        k=target;
        dfs(candidates,0,0);
        return ret;
    }
public void dfs(int[]candidates,int pos,int sum){
    if(sum==k){
        ret.add(new ArrayList<>(path));
        return;
    }
    if(sum>k){
        return;
    }
    //这个操作for是横着走
    for(int i=pos;i<candidates.length;i++){
    path.add(candidates[i]);
    //我们递归之后往下走,我认为传递的值,是为了回溯之后使用,
    //传递i是为了让他可以往下着走,pos相当于是横着的。
    //下一层接着从i位置开始,
    dfs(candidates,i,sum+candidates[i]);
    path.remove(path.size()-1);
       }
    }
}

解法2:

class Solution {
    List<List<Integer>>ret=new ArrayList<>();
    List<Integer>path=new ArrayList<>();
    int k;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
        k=target;
        dfs(candidates,0,0);
        return ret;
    }
public void dfs(int[]candidates,int pos,int sum){
    if(sum==k){
        ret.add(new ArrayList<>(path));
        return;
    }
    if(sum>k||pos==candidates.length){
        return;
    }
    //这个操作for是横着走,pos来做下标
    for(int i=0;i*candidates[pos]+sum<=k;i++){
    if(i!=0)path.add(candidates[pos]);
    dfs(candidates,pos+1,sum+i*candidates[pos]);
       }
       //回溯是把哪个情况列举完,再去恢复现场
       //恢复现场
    for(int i=1;i*candidates[pos]+sum<=k;i++){
           path.remove(path.size()-1);
       }   
    }
}

力扣784.字母大小写全排列

我的代码能力还是弱,但是能知道他的一些思想,确实画出图来,更容易去想

首先先说我的第一个困扰,就是字符串操作,我不是很会用字符串,因为他的各个方法已经一些东西,她这个转换成大写,我以为是在字符串上操作,没想到仅仅是我使用 

 char ch=s.charAt(pos);  使用一个字符,然后存储的是字符,pos在这里代表下标,

其次第二个困扰:怎么判断他是数字还是字符,我开始是想用ascll码,但是我又想到ascll也是数字,然后我也开始想过0-9但是我又否认了,因为我在想数字假如说是11,这种两位数不久错误了吗,我又突然醒悟,我字符串是一个一个取的,就算三位数111,他也是一个1一个1的取,换句话说数字就只有0-9,那么就是判断字符<0或者>9的时候不合格,然后字符A和a差一律32。

String修改不方便,以后都是使用StringBuffer用来修改字符串

class Solution {
    List<String>ret=new ArrayList<>();
    StringBuffer path=new StringBuffer();
    public List<String> letterCasePermutation(String s) {
    dfs(s,0);
    return ret;
    }
    public void dfs(String s,int pos){
    if(path.length()==s.length()){
       ret.add(path.toString());
       return ;
   }
   char ch=s.charAt(pos);
//不发生改变
path.append(ch);
dfs(s,pos+1);
path.deleteCharAt(path.length()-1);

if(ch<'0'||ch>'9'){
//发生改变
if(ch>='a'&&ch<='z'){
    ch-=32;
}else{
    ch+=32;
}
       path.append(ch);
       dfs(s,pos+1);
      path.deleteCharAt(path.length()-1);
       }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1425350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024斋月大促跨境卖家准备指南

市场覆盖西欧、中东、东南亚、北非地区的跨境电商卖家注意了&#xff0c;2024年的斋月即将开启&#xff0c;较往年日期&#xff0c;今年提前了10天左右&#xff0c;斋月的第一天预测在3月11日星期一到来。 根据Google搜索数据可知&#xff0c;目前已经进入高频“斋月”搜索期&…

小米商城服务治理之客户端熔断器(Google SRE客户端熔断器)

目录 前言 一、什么是Google SRE熔断器 二、Google SRE 熔断器的工作流程&#xff1a; 三、客户端熔断器 (google SRE 熔断器) golang GRPC 实现 四、客户端熔断器 (google SRE 熔断器) golang GRPC单元测试 大家可以关注个人博客&#xff1a;xingxing – Web Developer …

K8S网络

一、介绍 k8s不提供网络通信&#xff0c;提供了CNI接口(Container Network Interface&#xff0c;容器网络接口)&#xff0c;由CNI插件实现完成。 1.1 Pod通信 1.1.1 同一节点Pod通信 Pod通过虚拟Ethernet接口对&#xff08;Veth Pair&#xff09;与外部通信&#xff0c;Veth…

银河麒麟v10服务器版,specvirt测试

1 两台服务器&#xff0c;一台为SUT&#xff0c;一台为Phyclient。 1.1 两台服务器均编译安装gcc和qemu 按银河麒麟v10服务器arm版&#xff0c;qemugcc&#xff0c;跨架构安装虚拟机中步骤&#xff0c;编译安装gcc-9.3.0和qemu-7.0.0。 2 SUT服务器操作 2.1 mount数据盘到/…

如何发布自己的npm包:

1.创建一个打包组件或者库&#xff1a; 安装weback&#xff1a; 打开项目&#xff1a; 创建webpack.config.js,创建src目录 打包好了后发现两个js文件都被压缩了&#xff0c;我们想开发使用未压缩&#xff0c;生产使用压缩文件。 erserPlugin&#xff1a;&#xff08;推荐使用…

搭建 idea 插件仓库私服

正常情况下&#xff0c;我们开发的 idea 插件会发布到 idea 官方商城中&#xff0c;这样用户就可以在 idea 的 Marketplace 中搜索安装。 但是在企业内部&#xff0c;有可能我们开发了很多内部插件&#xff0c;而不能发布到公共市场中&#xff0c;这种情况下我们就需要搭建一个…

css多行文本擦拭效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>多行文本擦拭效果</title><style>* …

black--一键格式化Python代码

black black是一个Python代码格式化程序&#xff0c;使用它可以免于在调整代码格式上花费时间。black被许多大大小小的项目成功使用&#xff0c;包括pytest, tox, Pyramid, Django等。 格式化效果&#xff1a; 可以在线查看格式化效果&#xff1a;https://black.vercel.app/…

ERP系统助力车间生产:班组、设备、工序一网打尽!实现生产全流程可视化!

​随着企业生产规模的扩大和业务复杂性的增加&#xff0c;车间管理在企业运营中的地位日益突出。ERP系统作为企业资源管理的核心平台&#xff0c;为车间管理提供了全面的解决方案。通过合理配置和使用ERP系统的功能模块&#xff0c;企业可以优化生产流程、提高生产效率、确保产…

【SparkML系列3】特征提取器TF-IDF、Word2Vec和CountVectorizer

本节介绍了用于处理特征的算法&#xff0c;大致可以分为以下几组&#xff1a; 提取&#xff08;Extraction&#xff09;&#xff1a;从“原始”数据中提取特征。转换&#xff08;Transformation&#xff09;&#xff1a;缩放、转换或修改特征。选择&#xff08;Selection&…

一文看懂动态住宅代理IP,附常见使用问题解答

动态住宅代理IP在保护在线隐私和个人数据安全方面发挥着重要作用。通过隐藏用户的真实IP地址和地理位置&#xff0c;它为网络用户提供了一个更安全、更私密的网络环境。这对于希望保护自己免受网络监控和个人信息泄露的用户来说&#xff0c;是一项不可或缺的网络工具。 一、动态…

RT-Thread:STM32的PB3,PB4 复用IO配置为GPIO

说明&#xff1a;在使用 STM32F103CBT6 配置了 PB3 为IO&#xff0c;测试时发现读取这个IO的电平时钟是0&#xff0c;即便单管脚上的电平是1&#xff0c;读取的数据任然是0,查规格书后发现PB3,PB4是JTAG复用口&#xff0c;要当普通IO用需要配置。 配置工具&#xff1a;STM32Cu…

React中封装大屏自适应(拉伸)仿照 vue2-scale-box

0、前言 仿照 vue2-scale-box 1、调用示例 <ScreenAutoBox width{1920} height{1080} flat{true}>{/* xxx代码 */}</ScreenAutoBox> 2、组件代码 import { CSSProperties, ReactNode, RefObject, useEffect, useRef, useState } from react//数据大屏自适应函数…

36万的售价,蔚来理想卖得,小米卖不得?

文 | AUTO芯球 作者 | 雷歌 Are you OK&#xff1f;雷军被网友们叫“小雷”&#xff01; 被网友一猜再猜的小米SU7的价格&#xff0c;因为一份保险上牌价格单的曝光被网友吵得热热闹闹&#xff0c;曝出的小米汽车顶配上牌保险价格为36.14万。 20万以下&#xff0c;人们愿称…

Java强训day13(选择题编程题)

选择题 编程题 题目1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();char[] c s.toCharArray();int i 0;int t 0;while (i < c.length) {if (c[i] ! \") {…

【脑电信号处理与特征提取】P7-贾会宾:基于EEG/MEG信号的大尺度脑功能网络分析

基于EEG/MEG信号的大尺度脑功能网络分析 Q: 什么是基于EEG/MEG信号的大尺度脑功能网络分析&#xff1f; A: 基于脑电图&#xff08;EEG&#xff09;或脑磁图&#xff08;MEG&#xff09;信号的大尺度脑功能网络分析是一种研究大脑活动的方法&#xff0c;旨在探索脑区之间的功能…

qt内存自动释放的两种情况

qt内存管理机制 QObject的parent 我们时常能看到QWidget或者其他的控件的构造函数中有一项参数parent&#xff0c;默认值都为NULL&#xff0c;例如&#xff1a; QLineEdit(const QString &contents, QWidget *parent nullptr); QWidget(QWidget *parent nullptr, Qt::…

AI绘画探索人工智能的未来

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-8fL64RHWVzwpzR6m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

MBR分区转换为GPT分区

这里有一个ecs-test用于测试MBR转换为GPT 新增一块数据盘 将数据盘以MBR分区格式分区 将整块磁盘以mbr形式分区 格式化&#xff0c;挂载等 上传文件&#xff0c;方便测试(以便后续转换格式类型&#xff0c;防止文件丢失) 取消挂载 将MBR转换为GPT 需先下载gdisk yum instal…

【每日一题】6.LeetCode——轮转数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…