力扣40. 组合总和 II

1、C
void back(int* candidates, int candidatesSize, int target,int start,int *path,int *pathSize,int **result,int** returnColumnSizes,int *visited,int* returnSize,int *sum){
if(*sum == target){
result[*returnSize] = (int *)malloc(sizeof(int)*(*pathSize));
memcpy(result[*returnSize],path,sizeof(int)*(*pathSize));
(*returnColumnSizes)[*returnSize] = *pathSize;
(*returnSize)++;
return;
}
for(int i=start;i<candidatesSize; i++){
if((*sum)+candidates[i]>target){break;}
if(i>0&&candidates[i-1]==candidates[i]&&visited[i-1]==0){
continue;
}
path[*pathSize] = candidates[i];
(*pathSize)++;
(*sum) += candidates[i];
visited[i] = 1;
back(candidates,candidatesSize,target,i+1,path,pathSize,result,returnColumnSizes,visited,returnSize,sum);
visited[i] = 0;
(*sum) -= candidates[i];
(*pathSize)--;
}
}
void QuickSort1(int* a, int left, int right)
{
if (left >= right)
{
return;
}
int begin = left, end = right;
//三数取中
//int midIndex = GetThreeMid(a,begin,end);
//Swap(&a[begin],&a[midIndex]);
int pivot = begin;
int key = a[begin]; while (begin < end)
{
//右边找小的,如果不是小于key,继续
while (begin < end && a[end] >= key)
{
end--;
}
//找到比key小的,把它放在坑里,换新坑
a[pivot] = a[end];
pivot = end;
//左边找大的,如果不是大于key,继续
while (begin < end && a[begin] <= key)
{
begin++;
}
//找到比key大的,把它放在坑里,换新坑
a[pivot] = a[begin];
pivot = begin;
}
a[pivot] = key;//bengin 与 end 相遇,相遇的位置一定是一个坑
QuickSort1(a, left, pivot - 1);
QuickSort1(a, pivot + 1, right);
}
int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){ *returnSize = 0;
int *path = (int *)malloc(sizeof(int)*candidatesSize);
int *pathSize = (int *)calloc(1,sizeof(int));
int **result = (int **)malloc(sizeof(int *)*100001);
*returnColumnSizes = (int *)malloc(sizeof(int *)*100001);
int *visited = (int *)calloc(candidatesSize,sizeof(int));
int *sum = (int *)calloc(1,sizeof(int));
QuickSort1(candidates,0,candidatesSize-1);
back(candidates,candidatesSize,target,0,path,pathSize,result,returnColumnSizes,visited,returnSize,sum);
return result;
}
2、C++
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void back(vector<int>& candidates, int target,int start,int sum,vector<bool> &visited){
if(sum==target){
result.push_back(path);
return;
}
for(int i=start;i<candidates.size();i++){
if(sum+candidates[i]>target){break;}
if(i>0&&candidates[i-1]==candidates[i]&&visited[i-1]==false){continue;}
path.push_back(candidates[i]);
sum += candidates[i];
visited[i] = true;
back(candidates,target,i+1,sum,visited);
visited[i] = false;
sum -= candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<bool> visited(candidates.size(),false);
back(candidates,target,0,0,visited);
return result;
}
};
3、JAVA
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public void back(int[] candidates, int target,int start,int sum,boolean[] visited){
if(sum==target){
result.add(new ArrayList(path));
return;
}
for(int i=start;i<candidates.length;i++){
if(sum+candidates[i]>target){break;}
if(i>0&&candidates[i-1]==candidates[i]&&visited[i-1]==false){continue;}
path.addLast(candidates[i]);
visited[i] = true;
sum += candidates[i];
back(candidates,target,i+1,sum,visited);
sum -= candidates[i];
visited[i] = false;
path.removeLast();
}
}
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
boolean[] visited = new boolean[candidates.length];
Arrays.fill(visited,false);
back(candidates,target,0,0,visited);
return result;
}
}
4、Python

class Solution(object):
def __init__(self):
self.result = []
self.path = []
self.visited = []
def combinationSum2(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
candidates.sort()
self.visited = [False]*len(candidates)
self.back(candidates,target,0,0)
return self.result def back(self,candidates,target,start,sum):
if sum == target:
self.result.append(self.path[:]);
return
for i in range(start,len(candidates)):
if sum + candidates[i]>target:
break
if i>0 and candidates[i-1]==candidates[i] and self.visited[i-1]==False:
continue
self.path.append(candidates[i])
sum += candidates[i]
self.visited[i] = True
self.back(candidates,target,i+1,sum)
self.visited[i] = False
sum -= candidates[i]
self.path.pop()
 

四种语言刷算法之 组合总和 II的更多相关文章

  1. php四种基础排序算法的运行时间比较

    /** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...

  2. php四种基础排序算法的运行时间比较!

    /** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...

  3. SQL的四种语言和数据库范式

    1. SQL的四种语言 DDL(Data Definition Language)数据库定义语言 CREATE ALTER DROP TRUNCATE COMMENT RENAME DML(Data ...

  4. PHP四种基本排序算法

    PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数 ...

  5. 组合总和 II

    组合总和 II 题目介绍 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...

  6. Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II)

    Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II) 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使 ...

  7. Java实现 LeetCode 40 组合总和 II(二)

    40. 组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在 ...

  8. 40. 组合总和 II + 递归 + 回溯 + 记录路径

    40. 组合总和 II LeetCode_40 题目描述 题解分析 此题和 39. 组合总和 + 递归 + 回溯 + 存储路径很像,只不过题目修改了一下. 题解的关键是首先将候选数组进行排序,然后记录 ...

  9. 每个Java程序员都必须知道的四种负载均衡算法

    前言 一般来说,我们在设计系统的时候,为了系统的高扩展性,会尽可能的创建无状态的系统,这样我们就可以采用集群的方式部署,最终很方便的根据需要动态增减服务器数量.但是,要使系统具有更好的可扩展性,除了无 ...

  10. LeetCode 中级 - 组合总和II(105)

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

随机推荐

  1. python 中变量的命名规则与注释

    变量命名规则 1.变量名必须是大小写英文字母.数字或下划线 _ 的组合,不能用数字开头,并且对大小写敏感 2.关键字不能用于命名变量,关键字一共有35个,以下为关键字的获取 注释 代码注释提高了代码的 ...

  2. [机器学习] Yellowbrick使用笔记8-模型选择可视化

    Yellowbrick可视化工具旨在指导模型选择过程.一般来说,模型选择是一个搜索问题,定义如下:给定N个由数值属性描述的实例和(可选)一个估计目标,找到一个由特征.算法和最适合数据的超参数组成的三元 ...

  3. 聊聊web漏洞挖掘第一期

    之前写2022年度总结的时候,有提到要给大家分享漏洞挖掘技巧.这里简单分享一些思路,更多的内容需要大家举一反三. 文章准备昨晚写的,昨天晚上出去唱歌,回来太晚了,耽搁了.昨天是我工作的last day ...

  4. __int128:懒人的福音

    前言 对于一个懒懒的,不想写高精的人(就是我),每次都会遭遇到答案爆$long$  $long$的危险 比如说这道题: 题目传送门 最后的$23-25$的两个点,$long$  $long$甚至$un ...

  5. 使用vue创建一个吸顶的菜单项--简单版

    1.hover时候出现,总体来说只改了一下两个index.vue,还有route文件 src\layoutTwo\index.vue <template> <div class=&q ...

  6. 构建api gateway之 http路由实现

    http路由 路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程. 而这里的http路由其实等同于web开发中,根据http相关参数(比如url.http me ...

  7. C#移除字符串中的不可见Unicode字符

    背景 最近发现某个数据采集的系统拿下来的数据,有些字段的JSON被莫名截断了,导致后续数据分析的时候解析JSON失败. 类似这样 {"title": "你好 或者这样,多 ...

  8. 2023计算机领域顶会(A类)以及ACL 2023自然语言处理(NLP)研究子方向领域汇总

    2023年的计算语言学协会年会(ACL 2023)共包含26个领域,代表着当前前计算语言学和自然语言处理研究的不同方面.每个领域都有一组相关联的关键字来描述其潜在的子领域, 这些子领域并非排他性的,它 ...

  9. [​DuckDB] 多核算子并行的源码解析

    DuckDB 是近年来颇受关注的OLAP数据库,号称是OLAP领域的SQLite,以精巧简单,性能优异而著称.笔者前段时间在调研Doris的Pipeline的算子并行方案,而DuckDB基于论文< ...

  10. Listary 文件搜索工具

    Listary简介 Listary是一款强大的全盘文件搜索.软件启动效率工具,双击Ctrl随时调出搜索框,全盘海量文件毫秒级检索,快速定位打开所需文件.集成右键菜单和诸多自定义动作,适配Windows ...