LeetCode 40.组合总和 II

news2024/12/4 17:27:15

组合总和 II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。

方法一、回溯

由于题目要求解集不能包含重复的组合,因此和39.组合总和解法不同。

怎么去重呢?
去重
优化剪枝方法:
在这里插入图片描述

Swfit

class Solution {
    var freq = [(Int, Int)]()//记录数字出现的频率,元组表示(Int,Int),第一个参数为数字,第二个参数为次数
    var ans:[[Int]] = [[Int]]()
    var sequence = [Int]()
    
    
    
    func combinationSum2(_ candidates: [Int], _ target: Int) -> [[Int]] {
        
        let candi = candidates.sorted()
        
        for val in candi {
            if freq.isEmpty || val != freq.last!.0 {
                freq.append((val, 1))
            }else {
                let cnt = freq.last!.1 + 1
                let _ = freq.popLast()
                freq.append((val, cnt))
            }
        }
        
        dfs(0, target)
        
        return ans
    }
    
    func dfs(_ pos: Int, _ rest: Int) {
        
        if rest == 0 {
            ans.append(sequence)
            return
        }
        
        if pos == freq.count || rest < freq[pos].0 {
            return
        }
        
        dfs(pos+1, rest)
        
        
        let most = min(rest/freq[pos].0, freq[pos].1)
        if most == 0 {
            return
        }
        
        for i in 1...most {
            sequence.append(freq[pos].0)
            
            dfs(pos+1, rest-i*freq[pos].0)
        }
        
        for _ in 1...most {
            let _ = sequence.removeLast()
        }
    }
}

OC

#import "Number40.h"

@interface Number40 ()

@property (nonatomic, strong) NSMutableArray <NSArray *>*freq;
@property (nonatomic, strong) NSMutableArray *sequece;
@property (nonatomic, strong) NSMutableArray <NSArray *>*ans;

@end


@implementation Number40

- (instancetype)init {
    self = [super init];
    if (self) {
        _freq = [NSMutableArray array];
        _sequece = [NSMutableArray array];
        _ans = [NSMutableArray array];
    }
    return self;
}

- (NSArray *)combinationSum:(NSArray *)candidates target:(NSInteger)target {
    candidates = [candidates sortedArrayUsingComparator:^NSComparisonResult(NSNumber * obj1, NSNumber *obj2) {
        return [obj1 compare:obj2];
    }];
    
    //记录每个数据出现的次数
    for (NSNumber *num in candidates) {
        NSInteger inte = [num integerValue];
        if (_freq.count == 0 || [_freq.lastObject[0] integerValue] != inte) {
            [_freq addObject:@[num, @1]];
        }else {
            NSInteger cnt = [_freq.lastObject[1] integerValue] + 1;
            [_freq removeLastObject];
            [_freq addObject:@[num, @(cnt)]];
        }
    }
    
    [self dfs:0 rest:target];
    
    return self.ans;
}

- (void)dfs:(NSInteger)pos rest:(NSInteger)rest {
    if (rest == 0) {
        [self.ans addObject:self.sequece];
        return;
    }
    
    if (pos == self.freq.count || rest < [self.freq[pos].firstObject integerValue]) {
        return;
    }
    
    [self dfs:pos+1 rest:rest];
    
    NSInteger most = MIN(rest/[self.freq[pos].firstObject integerValue], [self.freq[pos].lastObject integerValue]);
    for (NSInteger i = 1; i<=most; i++) {
        [self.sequece addObject:self.freq[pos].firstObject];
        
        [self dfs:pos+1 rest:rest-i*[self.freq[pos].firstObject integerValue]];
    }
    
    for (NSInteger i = 1; i<=most; i++) {
        [self.sequece removeLastObject];
    }
}

@end

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

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

相关文章

第十九周周报

文章目录 摘要文献阅读DeepHuman: 3D Human Reconstruction from a Single Image(ICCV 2019)贡献摘要网络结构总结 PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization贡献摘要网络结构总结 Animated 3D human avatars from a single imag…

多项式乘法逆(p4238 NTT)

题目路径&#xff1a; https://www.luogu.com.cn/problem/P4238 思路&#xff1a; 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<cstring> #include<cmath> #include<ctime> #include&l…

有什么办法可以让模糊的老照片变清晰?这几个方法收藏好!

照片盒子里的老照片&#xff0c;宛如一扇陈旧的时光之门&#xff0c;等着我们去开启。那些尘封的记忆&#xff0c;似乎已经被时间遗忘&#xff0c;但当我们轻轻拂去尘埃&#xff0c;那些熟悉的画面便再次浮现在眼前。然而&#xff0c;岁月无情&#xff0c;这些宝贵的瞬间在时间…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码&#xff0c;但是php/Java的不能看到&#xff0c;也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有&#xff1a; 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

Linux | makefile简单教程 | Makefile的工作原理

前言 在学习完了Linux的基本操作之后&#xff0c;我们知道在linux中编写代码&#xff0c;编译代码都是要手动gcc命令&#xff0c;来执行这串代码的。 但是我们难道在以后运行代码的时候&#xff0c;难道都要自己敲gcc命令嘛&#xff1f;这是不是有点太烦了&#xff1f; 在vs中…

Docker安装多个nginx容器时,要注意端口设置:

Docker安装多个nginx容器时&#xff0c;要注意端口设置&#xff1a; docker run -id --namemynginx4 -p 8089:80 nginx 安装多个nginx容器时&#xff0c;要注意端口设置&#xff1a;宿主机80端口已经被暂用&#xff0c;所以宿主机端口一定不能设置位80&#xff0c;但是容器上80…

Vulnhub靶场DC-7

本机192.168.223.128 目标192.168.223.136 主机发现 nmap -sP 192.168.223.0/24 端口发现 nmap -sV -p- -A 192.168.223.136 开启了22 80端口 80端口apache服务 先进入web界面看一下 提示&#xff1a;DC7加了一些新的东西&#xff0c;让我看看盒子之外的东西&#xff0c;与…

C++ 利用容器适配器,仿函数实现栈,队列,优先级队列(堆),反向迭代器,deque的介绍与底层

C 利用容器适配器,仿函数实现栈,队列,优先级队列【堆】,反向迭代器,deque的介绍与底层 一.容器适配器的介绍二.利用容器适配器实现栈和队列1.stack2.queue 三.仿函数介绍1.什么是仿函数2.仿函数的使用3.函数指针的使用1.函数指针的用处2.利用函数指针完成回调3.利用仿函数完成回…

docker 体验怀旧游戏(魂斗罗等)

docker run --restart always -p 8081:80 --name fc-games -d registry.cn-hangzhou.aliyuncs.com/bystart/fc-games:latest ip:8081访问 jsnes: js制作了一个网页版的NES模拟&#xff0c;可以在网页上玩fc游戏 (gitee.com)

创建第一个 Spring 项目(IDEA社区版)

文章目录 创建 Spring 项目创建一个普通的 Maven 项目添加 Spring 依赖IDEA更换国内源 运行第一个 Spring 项目新建启动类存储 Bean 对象将Bean注册到Spring 获取并使用 Bean 对象 创建 Spring 项目 创建一个普通的 Maven 项目 首先创建一个普通的 Maven 项目 添加 Spring 依…

Tomcat好帮手---JDK

目录 1、Tomcat好帮手---JDK 2、安装JDK 部署Tomcat参考博主博客 部署TOMCAT详解-CSDN博客 1、Tomcat好帮手---JDK JDK是 Java 语言的软件开发工具包&#xff0c;JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA…

2024年新提出的算法:一种新的基于数学的优化算法——牛顿-拉夫森优化算法|Newton-Raphson-based optimizer,NRBO

1、简介 开发了一种新的元启发式算法——Newton-Raphson-Based优化器&#xff08;NRBO&#xff09;。NRBO受到Newton-Raphson方法的启发&#xff0c;它使用两个规则&#xff1a;Newton-Raphson搜索规则&#xff08;NRSR&#xff09;和Trap Avoidance算子&#xff08;TAO&#…

视频压缩怎么才能保持画质清晰?这样设置参数~

很多时候我们都需要压缩视频&#xff0c;但在减小视频大小的时候我们也会担心画质清晰度问题&#xff0c;那怎么既能压缩视频大小&#xff0c;又能保证视频清晰度呢&#xff1f;下面就来了解下吧~ 视频压缩分为无损压缩和有损压缩&#xff0c;如果想保持画质清晰&#xff0c;可…

[C#]winform部署yolov5实例分割模型onnx

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 YOLOv5实例分割是目标检测算法的一个变种&#xff0c;主要用于识别和分割图像中的多个物体。它是在YOLOv5的基础上&#xff0c;通过添加一个实例分割模块来实现的。 在实例分割中&#xff0c;算法不仅…

spring-boot redis stream消息队列demo-及死信简单处理

Redis stream 是 Redis 5 引入的一种新的数据结构&#xff0c;它是一个高性能、高可靠性的消息队列&#xff0c;主要用于异步消息处理和流式数据处理。在此之前&#xff0c;想要使用 Redis 实现消息队列&#xff0c;通常可以使用例如&#xff1a;列表&#xff0c;有序集合、发布…

RedisInsight详细安装教程

简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#xff09;。 RedisIn…

用navigator.sendBeacon完成网页埋点异步请求记录用户行为,当网页关闭的时候,依然后完美完成接口请求,不会因为浏览器关闭了被中断请求。

代码用例 <template><div :class"$options.name"><el-button type"primary" click"sendBeacon">navigator.sendBeacon 请求埋点接口 发送json对象数据</el-button></div> </template><script> expor…

JVM系列-7内存调优

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

TensorFlow2实战-系列教程3:猫狗识别1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、项目介绍 数据预处理&#xff1a;图像数据处理&#xff0c;准备训练和验证数据集卷…

无人值守变电所运维在海南市某住宅区的应用

1 前言 随着国家电网改革政策的逐步推进和落实&#xff0c;AcrelCloud-1000变电所运维云平台运用互联网和大数据技术&#xff0c;为电力运维公司提供变电所运维云平台。该平台作为连接运维单位和用电企业的纽带&#xff0c;监视用户配电系统的运行状态和电量数据&#xff0c;为…