力扣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. uniapp 微信小程序 改变头部的信号、时间、电池显示颜色

    修改前 修改后 修改方法:"navigationBarTextStyle":"white"

  2. 【基础篇】一文带你掌握 Redis

    一.摘要 谈起 Redis,相信大家都不会陌生,做过云平台开发的程序员多多少少会接触到它,Redis 英文全称:Remote Dictionary Server,也被称之为远程字典服务. 从官方的定义 ...

  3. Service层和Dao层的一些自我理解(╥╯^╰╥)(╥╯^╰╥)(学了这么久,这玩意儿似懂非懂的)

    学习java已经有很长时间了,但由于是在学校学的,基础不怎么扎实. 这几个月系统的学习,弥补了很多的缺陷,虽然大多数时间都在弄算法(咳咳),我前面的博客有写 如果有认真看过我代码的朋友会发现,我其实英 ...

  4. 【转载】SQL SERVER 表变量与临时表的优缺点

    什么情况下使用表变量?什么情况下使用临时表? -- 表变量: DECLARE @tb table(id int identity(1,1), name varchar(100)) INSERT @tb ...

  5. eclipse启动一个Springboot项目

    1.准备一个Springboot项目 2.配置好maven 注:本地的maven-repository默认路径是在系统盘的.m文件夹.如果想要修改可参考: eclipse修改maven仓库的位置_本本 ...

  6. 一个开放源代码,实现动态IL注入(Hook或补丁工具)框架:Lib.Harmony(Patch,PatchAll,Prefix,Postfix,Transpiler)

    详情请参考原文:一个开放源代码,实现动态IL注入(Hook或补丁工具)框架:Lib.Harmony  

  7. Git和Maven的学习笔记

    Git 1.Git简介 Git 是一个免费的.开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种 项目. Git 易于学习,占地面积小,性能极快. 它具有廉价的本地库,方便的暂存区域和多个 ...

  8. [python] Python map函数总结

    Python map函数总结 本文主要介绍如何使用Python(Python3版本)的内置map()函数.简单来说map()函数会将指定的函数依次作用于某个序列的每个元素,并返回一个迭代器对象.map ...

  9. day02-Promise

    Promise 1.Promise基本介绍 Promise是异步编程的一种解决方案,可以解决传统Ajax回调函数嵌套问题. 传统的Ajax异步调用在需要多个操作的时候,会导致多个回调函数嵌套,导致代码 ...

  10. Mybatis用List接收返回值

    Mybatis 用 List 接收返回值 以 List<Map<String, Object>> 为例 1.XML内 resultType 为单条记录对应类型,设置成 java ...