力扣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. docker 第二课

    构建nginx镜像 Dockerfile 指令: FROM centos:7.9.2009 #在整个dockfile文件中除了注释之外的第一行,要是FROM ,FROM 指令当前镜像的用于指定父镜像( ...

  2. go的grpc环境源码编译安装

    go的grpc环境安装 参考grpc-go官方文档:https://grpc.io/docs/languages/go/quickstart/ 视频教程:https://www.bilibili.co ...

  3. Young's theorem杨氏定理

    杨氏定理 定理叙述 参考百度百科. Young's Theorem: Let \(f\) be a differentiable function of \(n\) variables. If eac ...

  4. Python 文件操作(IO 技术)

    目录 Python 文件操作(IO 技术) 文本文件和二进制文件 文件操作相关模块概述 建文件对象 open() 文本文件的写入 write()/writelines()写入数据 close()关闭文 ...

  5. 内网渗透-smb&wmi明文&hash传递

    首先我们要知道,在windows2012以上版本默认会关闭wdigest,那么攻击者就无法从内存中获取明文密码了 windows2012以下的版本如果安装了KB2871997补丁,那么同样也会导致无法 ...

  6. Java基础篇——JVM初步

    1.JVM的位置 2.JVM体系结构 3.类加载器 虚拟机加载器(java) 启动类(根)加载器(C++) 扩展类加载器(java)↑ 应用程序加载器(java)↑ 4.双亲委派机制 类加载器收到类加 ...

  7. Creator 2.x 升级 3.x 基础 API 差异总结

    上一篇我们介绍了 Cocos Creator 2.x 项目升级 3.x 的大流程. 但最后一步,还需要手动将之前 2.x 写的函数注释一处处的放开. 并将 2.x 的代码写法改成 3.x 的,下面我们 ...

  8. 超级容易理解的Three.js中的物体rotation

    假设模特头朝着自己现在躺在地上 那么改变Y就是等于躺着转圈圈 mesh.rotation.set( 0,Math.PI/1.2,0); 改变X就意味着,这个是本来模特头朝着自己躺着,然后站起来了,后脑 ...

  9. JS按空格和换行或者其他字符进行切割形成数组

    据我所测试,目前最好用的代码是: 方案一 let arr = value.split(/[,,\s\n]/).filter(_ => _) 方案二 let arr = value.replace ...

  10. 1.MAC获取文件路径;2.MAC使用SSH连接远程服务器,实现文件上传下载

    首先来说一下如何获取文件路径 ····打开terminal,把文件拖进terminal 窗口,自动显示路径. 接下来说一下使用SSH连接远程服务器,实现文件上传下载 1.  上传本地文件到服务器 sc ...