【力扣】77. 组合 <回溯、回溯剪枝>

news2024/11/17 19:41:32

目录

    • 【力扣】77. 组合
    • 题解
      • 回溯
        • 回溯法三步
        • 剪枝优化

【力扣】77. 组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按任何顺序返回答案。

示例 1:
输入:n = 4, k = 2
输出:

[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:
输入:n = 1, k = 1
输出:

[[1]]

提示:
1 <= n <= 20
1 <= k <= n

题解

暴力思考:k 等于多少就是多少层循环。

//示例中k为2
int n = 4;
for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {	
    	sout(i+" "+j);
   	}
}

//示例中k为3
int n = 100;
for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
        for (int u = j + 1; u <= n; n++) {
        	sout(i+" "+j+" "+u);
        }
    }
}

回溯

回溯法解决的问题都可以抽象为树形结构(N叉树)。

n 相当于树的宽度,k 相当于树的深度。图中每次搜索到了叶子节点,就找到了一个结果。
在这里插入图片描述

回溯法三步

  • 递归函数的返回值以及参数

  • 回溯函数终止条件

  • 单层搜索的过程

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}
import java.util.*;

public class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }

    public void backtracking(int n, int k, int startIndex) {
        // 终止条件
        if (path.size() == k) {
            //存放结果
            result.add(new ArrayList<>(path));
            return;
        }

        //横向遍历
        for (int i = startIndex; i <= n; i++) {
            //处理节点
            path.add(i);
            //纵向搜索
            backtracking(n, k, i + 1);
            //回溯,撤销处理结果
            path.removeLast();
        }
    }
}

剪枝优化

在这里插入图片描述
剪枝的地方就在递归中每一层的for循环所选择的起始位置。如果 for 循环选择的起始位置之后的元素个数已经不足需要的元素个数,那么就没有必要搜索了。

  • 已经选择的元素个数:path.size();
  • 还需要的元素个数为: k - path.size();
  • 在集合 n 中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历
for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜索的起始位置
import java.util.*;

public class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }

    public void backtracking(int n  , int k, int startIndex) {
        // 终止条件
        if (path.size() == k) {
            //存放结果
            result.add(new ArrayList<>(path));
            return;
        }

        //横向遍历
        for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {// i为本次搜索的起始位置
            //处理节点
            path.add(i);
            //纵向搜索
            backtracking(n, k, i + 1);
            //回溯,撤销处理结果
            path.removeLast();
        }
    }
}

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

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

相关文章

x86 Linux系统下构建交叉编译工具(3)

接前一篇文章&#xff1a;x86 Linux系统下构建交叉编译工具&#xff08;2&#xff09; 本文参考以下文章&#xff1a; 建立交叉编译器 for arm &#xff08;binutils-2.17 gcc-3.4.6 glibc-2.3.6&#xff09; 特此致谢&#xff01; 上一回构建了binutils的交叉环境&#xff0…

实例040 限制窗体大小

实例说明 Windows窗体是可以随意改变大小的&#xff0c;然而对于一些要求严格的窗体&#xff0c;开发人员不希望用户随意的改变其大小&#xff0c;例如&#xff0c;定位准确的地图和游戏软件等。遇到这种情况必须对窗口的大小进行一些限制。本例设计一个限制了大小的窗体&#…

幼儿园托幼机构管理系统 微信小程序

托幼机构管理系统微信小程序从功能、数据流程、可行性、运行环境进行需求分析。对托幼机构管理系统微信小程序的数据库、功能进行了详细设计&#xff0c;分析了主要界面设计和相关组件设计&#xff0c;托幼机构管理系统微信小程序的具体实现进行了介绍。从数据库中获取数据、向…

小航助学GESP_C++一级模拟测试卷第4套(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

qt中窗口的布局

qt中窗口的布局 常用的窗口布局方式使用拖拽控件的方式调用窗口布局使用Widget控件完成窗口布局布局中嵌套布局demo&#xff08;制作登录页面&#xff09; 如果不使用窗口布局&#xff0c;会带来的后果&#xff1a; 控件可能显示不出来不能按照期望的大小显示不能跟随窗口进行…

时间戳转换成浏览器对应的UTC时间、时间戳根据对应的时区转换成对应的UTC时间

/*** 毫秒级时间戳转成 浏览器时间对应的 UTC时间**/toBrowserTime(timestamp) {//输入毫秒级 timestamp1692579702028if (!timestamp) {return null} else {let date moment(timestamp).format()let browserTime date.replace(/-/g, "/").replace(/T/g, " &q…

如何说服技术老大用 Redis ?

这个问题很微妙&#xff0c;可能这位同学内心深处&#xff0c;觉得 Redis 是所有应用缓存的标配。 缓存的世界很广阔&#xff0c;对于应用系统来讲&#xff0c;我们经常将缓存划分为本地缓存和分布式缓存。 本地缓存 &#xff1a;应用中的缓存组件&#xff0c;缓存组件和应用…

FPGA_学习_16_IP核_ROM(延迟一拍输出)

在寻找APD最合适的偏压的过程中&#xff0c;一般会用到厂商提供一条曲线&#xff0c;横坐标是温度的变化&#xff0c;纵坐标表示击穿偏压的变化&#xff0c;但每个产品真正的击穿偏压是有差异的。 为了能够快速的找到当前温度下真实的击穿偏压&#xff0c;我们可以这样做&#…

YOLO入门介绍

YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;它的核心思想是将目标检测任务转化为一个回归问题&#xff0c;通过单次前向传播即可完成目标检测。相比于传统的目标检测算法&#xff0c;YOLO具有更快的检测速度和更高的准确率&a…

定时检测接口是否正常飞书告警脚本

第一版 支持多个接口地址&#xff0c;循环检测&#xff0c;定时每分钟执行一次脚本 告警效果 脚本 飞书机器人创建忽略跳过&#xff0c;各大协作平台大同小异拿出机器人hook地址 #!/bin/bash URL_LIST(https://gatewaxxxxxxxxxxxxxxxxxx https://sandbox-gatexxxxxxxxxxxxxxx…

机器学习深度学习——NLP实战(情感分析模型——textCNN实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;情感分析模型——RNN实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习…

NDK 的配置记录~

NDK 的配置 NDK配置 NDK设置在 AS 路径中设置在 local.properties设置在 build.gradle ndk 和 gradle 对应关系gradle的插件和版本对应关系gradle 插件和NDK对应关系 NDK NDK&#xff08;Native Development Kit&#xff09;是一组工具和库&#xff0c;用于在 Android 平台上开…

加强预算管理一体化,走进全面预算管理的数智化时代

自2021年&#xff0c;国务院印发《国务院关于进一步深化预算管理制度改革的意见》&#xff08;国发〔2021〕5号&#xff09;以来&#xff0c;中央政府对企业实施全面预算管理越来越重视&#xff0c;预算绩效管理逐渐进入大家的视线。各个企业逐步落实应用&#xff0c;推进预算管…

C++的常用基础知识100个

1、定义一个常量 2、数据类型-整型 3、数据类型-字符型 4、数据的输入 5、运算符 6、三目运算符 7、循环案例-99乘法表 8、数组 9、冒泡排序 10、函数的定义 11、函数的分文件编写 12、指针 12、结构体 13、通讯录项目 创建一个空项目&#xff0c;并命名为通讯录管理系统。 14…

“我来拿”APP设计报告

1.设计摘要 想必大家对学校的悬赏互助群并不陌生&#xff0c;学生们在群里提出要求并标明价格&#xff0c;就可以找人帮忙。我们的跑腿平台就是以此为灵感&#xff0c;让学生之间通过一个专门的020平台实现有报酬的互助跑腿&#xff0c;但是相比QQ、微信群&#xff0c;我们让定…

js数组常用的方法(总结)

目录 1.数组头和尾操作——push、pop、unshift/shift 2、数组转为字符串 —— join() 3、数组截取 —— slice() 4、数组更新 —— splice() 5、反转数组 —— reverse() 6、连接数组 —— concat() 7、ES6连接数组 —— ... ES5数组新增方法 8、索引方法 —— indexO…

PgSQL中的DATE_PART使用

用法&#xff1a; DATE_PART(field, source) 这个DATE_PART()函数返回类型为double precision的值 century decade year month day hour minute second microseconds milliseconds dow doy epoch isodow isoyear timezone timezone_hour timezone_minute

水经微图网页版发布

水经微图网页版&#xff0c;可轻松将关注的地点制作成你的个人地图。 你可以在任意位置添加标注点或绘制地图&#xff0c;查找地点并将其保存到你的地图中&#xff0c;或导入地图数据迅速制作地图并保存&#xff0c;你还可以运用图标和颜色展示个性风采&#xff0c;从而可让每…

线程阻塞队列

阻塞队列 一、BlockingQueue 接口 BlockingQueue 是阻塞队列接口实现机制是使用两条线程&#xff0c;允许两个线程同时操作队列一个线程用于写入 Put ,一个线程用于读取 Take当队列中没有数据的情况下&#xff0c;读取线程会自动阻塞&#xff0c;直到有数据放入队列当队列中数…

opencv进阶12-EigenFaces 人脸识别

EigenFaces 通常也被称为 特征脸&#xff0c;它使用主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09; 方法将高维的人脸数据处理为低维数据后&#xff08;降维&#xff09;&#xff0c;再进行数据分析和处理&#xff0c;获取识别结果。 基本原理…