暴搜,回溯,剪枝

力扣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.mfbz.cn/a/364547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MSVC++远程调试

1. 介绍 MSVC的调试功能非常强大&#xff0c;可以下断点&#xff0c;单步调试&#xff0c;查看堆栈变量信息等。实际用于生产的电脑环境复杂&#xff0c;更容易发生Bug。生产电脑&#xff0c;由于各种原因有些可能无法安装MSVC用来现场调试。基于打印日志&#xff0c;查看日志…

【DDD】学习笔记-限界上下文对架构的影响

通信边界对架构的影响 限界上下文的通信边界会对系统的架构产生直接的影响&#xff0c;在此之前&#xff0c;我们需要理清几个和边界有关的概念。如前所述&#xff0c;我提出了限界上下文的通信边界的概念&#xff0c;并将其分为进程内通信与进程间通信两种方式。在 Toby Clem…

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址&#xff1a;https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本&#xff1a; [rootmaster1 kube-state-metrics]# ll 总用量 …

C++ Web 编程

什么是 CGI&#xff1f; 公共网关接口&#xff08;CGI&#xff09;&#xff0c;是一套标准&#xff0c;定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。CGI 规范目前是由 NCSA 维护的&#xff0c;NCSA 定义 CGI 如下&#xff1a;公共网关接口&#xff08;CGI&…

人工智能福利站,初识人工智能,机器学习,第四课

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

重写Sylar基于协程的服务器(3、协程模块的设计)

重写Sylar基于协程的服务器&#xff08;3、协程模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

一站式在线协作开源办公软件ONLYOFFICE,协作更安全更便捷

1、ONLYOFFICE是什么&#xff1f; ONLYOFFICE是一款功能强大的在线协作办公软件&#xff0c;可以创建编辑Word文档、Excel电子表格&#xff0c;PowerPoint&#xff08;PPT&#xff09;演示文稿、Forms表单等多种文件。ONLYOFFICE支持多个平台&#xff0c;无论使用的是 Windows、…

深入了解c语言字符串 2

深入了解c语言字符串 2 一 使用 scanf进行字符串的输入&#xff1a;1.1输入单词&#xff08;不包含空格&#xff09;&#xff1a;1.2 输入带空格的整行文本&#xff1a;1.3 处理输入缓冲区&#xff1a;1.4 注意安全性&#xff1a; 二 使用 printf 字符串的输出&#xff1a;三 输…

2024美赛C题全网最早思路 网球运动(持续更新)

2024美赛已经于今天早上6点准时公布题目。本次美赛将全程跟大家一起战斗冲刺O奖&#xff01;思路持续更新。 2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系…

Jmeter学习系列之五:线程组(Thread Group)

前言 线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中,每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中,线程组组件运行用户设置线程数量、初始化方式等等配置。 例如,如果你设置线程数为 100,那么 jmeter 将创建…

2024美赛数学建模C题思路分析 - 网球的动量

1 赛题 问题C&#xff1a;网球的动量 在2023年温布尔登绅士队的决赛中&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉兹击败了36岁的诺瓦克德约科维奇。这是德约科维奇自2013年以来首次在温布尔登公开赛失利&#xff0c;并结束了他在大满贯赛事中历史上最伟大的球员之一的非凡表…

双非本科准备秋招(13.1)—— 力扣 栈、队列与堆

1、103. 二叉树的锯齿形层序遍历 昨天做的二叉树的层序遍历&#xff0c;把代码直接拿过来。 这个题要求的是一个Z型遍历&#xff0c;如下图。 用一个变量f记录正反顺序&#xff0c;然后使用LinkedList记录答案&#xff0c;下图可以看到LinkedList继承了Deque&#xff0c;所以…

k8s二进制及负载均衡集群部署详解

目录 常见部署方式 二进制部署流程 环境准备 操作系统初始化配置 关闭防火墙 配置SELinux 关闭SWAP 根据规划设置主机名 在master添加hosts&#xff0c;便于主机名解析 调整内核参数 配置时间同步 部署docker引擎 在所有node节点部署docker引擎 部署etcd集群 签发…

【文本到上下文 #8】NLP中的变形金刚:解码游戏规则改变者

一、说明 欢迎来到我们对不断发展的自然语言处理 &#xff08;NLP&#xff09; 领域的探索的第 8 章。在本期中&#xff0c;我们将重点介绍一项重塑 NLP 格局的突破性创新&#xff1a;Transformers。在我们之前对 seq2seq 模型、编码器-解码器框架和注意力机制的讨论之后&#…

flutter如何实现省市区选择器

前言 当我们需要用户填写地址时&#xff0c;稳妥的做法是让用户通过“滚轮”来滑动选择省份&#xff0c;市&#xff0c;区&#xff0c;此文采用flutter的第三方库来实现这一功能&#xff0c;比调用高德地图api简单一些。 流程 选择库 这里我选择了一个最近更新且支持中国的…

ABAP Range Table:RANGES的使用

目录 Range TableRANGERANGES RANGE的四个参数SIGNOPTIONLOWHIGH示例程序 Range Table 1、Range Table 概述 RANGE TABLE为 SAP R/3系统标准内表的一种&#xff0c;结构与 Selection Table 一致&#xff0c; 由 SIGN, OPTION, LOW 和 HIGH字段组成&#xff1b; 可以通过 TYPE…

面试宝典之深谈JVM

面试宝典之深谈JVM 1.为什么需要JVM&#xff0c;不要JVM可以吗&#xff1f; 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译&#xff0c;到处运行 2.JVM可以运行Class文件 2.JDK&#xff0c;JRE以及JVM的关系 3.我们的编译器到底干了什么事&#xff1f; 仅仅是将我们的 .ja…

【动态规划】【C++算法】1340. 跳跃游戏 V

作者推荐 【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数 本文涉及知识点 动态规划汇总 LeetCode1340跳跃游戏 V 给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到&#xff1a; i x &#xff0c;其中 i x < arr.length 且 0 < x…

用户界面(UI)、用户体验(UE)和用户体验(UX)的差异

对一个应用程序而言&#xff0c;UX/UE (user experience) 设计和 UI (user interface) 设计非常重要。UX设计包括可视化布局、信息结构、可用性、图形、互动等多个方面。UI设计也属于UX范畴。正是因为三者在一定程度上具有重叠的工作内容&#xff0c;很多从业多年的设计师都分不…
最新文章