LeetCode 40.组合总和 II

组合总和 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 + 1let _ = 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.hqwc.cn/news/433600.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶--queue和stack

stack stack是一种容器适配器&#xff0c;按照后进先出的原则存储数据。通过 #include< stack > 头文件进行提供&#xff1b; stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供一组特定的成员函数来访问其元素&…

03 SB实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

【51单片机】蜂鸣器实验和动态数码管实验

目录 蜂鸣器实验蜂鸣器介绍硬件设计软件设计 动态数码管实验多位数码管简介74HC245 芯片简介74HC138 芯片简介 硬件设计软件设计 橙色 蜂鸣器实验 蜂鸣器介绍 蜂鸣器采用直流电压供电&#xff0c;分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 无论是压电式蜂鸣器还是电磁式蜂…

SpringMVC 环境搭建入门

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架&#xff0c;属于SpringFrameWork 的后续产品&#xff0c;已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一&#xff0c;并且随着Spring3.0 的发布&#xff0c;全面…

如何用甘特图跟踪项目进度

甘特图是一个简单但是极其强大的项目管理工具,能够清晰可视化复杂项目的进度,在项目跟踪和控制上发挥重要作用。任何一个严肃的项目组织者都会使用甘特图来规划和管理项目中的任务。 甘特图的纵坐标表示项目的各项活动或任务,横坐标表示项目的时间进度。每个任务用一条横条表示…

【C++中STL】set/multiset容器

set/multiset容器 Set基本概念set构造和赋值set的大小和交换set的插入和删除set查找和统计 set和multiset的区别pair对组两种创建方式 set容器排序 Set基本概念 所有元素都会在插入时自动被排序。 set/multist容器属于关联式容器&#xff0c;底层结构属于二叉树。 set不允许容…

软件设计师——计算机网络(四)

&#x1f4d1;前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

Zookeeper3.5.7基础学习

文章目录 一、Zookeeper入门1、概述2、特点3、数据结构4、应用场景 二、Zookeeper 安装部署1、本地模式安装1.1 基础操作1.2 配置参数解读 2、集群部署2.1 集群安装2.2 选举机制(面试重点)2.3 ZK 集群启动停止脚本 三、ZK客户端相关操作1、客户端命令行操作1.1 命令行语法1.2 z…

Python 数据分析实战——为什么销售额减少?酒卷隆治_案例1

# 为什么黑猫游戏的销售额会减少&#xff1f; # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&…

【C/C++】C/C++编程——C++ 关键字和数据类型简介

C 关键字和数据类型简介 大家好&#xff0c;我是 shopeeai&#xff0c;也可以叫我虾皮&#xff0c;中科大菜鸟研究生。昨天已经成功运行了第一个C程序&#xff0c;今天来学习一下C 关键字和数据类型。C 中的关键字是由 C 标准预先定义的。它们被保留作为语言的一部分&#xff…

Android源码设计模式解析与实战第2版笔记(一)

第一章 走向灵活软件之路 — 面向对象的六大原则 优化代码的第一步 — 单一职责原则 单一职责原则的英文名称是Single Responsibility Principle&#xff0c;缩写是SRP。 SRP&#xff1a;就一个类而言&#xff0c;应该仅有一个引起它变化的原因。 一个类中应该是一组相关性很…

SpringBoot操作Jedis

SpringBoot操作Jedis 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…