力扣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. 搭建IIS网站后,点击浏览地址,报403错误

    点击左侧的浏览地址,报右侧的错误,可将目录浏览进行启用 双击进去,进行启用即可

  2. uniapp 微信小程序 实现左侧菜单右侧列表,双向联动的效果

    <template> <view class="u-wrap"> <view class="u-search-box"> & ...

  3. AIR32F103(七) AIR32F103CBT6/CCT6启用96K内存

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  4. DTMF2num拨号音识别

    说明 很多出题人可能会把手机或者其他设备打电话的拨号音作为一个题目技能中的考察点. 什么是DTMF? 双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频.每按一个键就发送一个高频 ...

  5. [seaborn] seaborn学习笔记12-绘图实例(4) Drawing example(4)

    文章目录 12 绘图实例(4) Drawing example(4) 1. Scatterplot with varying point sizes and hues(relplot) 2. Scat ...

  6. 记一个难以发现的 UB

    观察以下代码: vector<int> X, Y, A, val; inline int ls(int p) { return p << 1; } inline int rs( ...

  7. HttpServletRequest获取参数和文件

    从HttpServletRequest中获取上传文件及参数的方法 try { //下面这句必须加,不然报错 MultipartResolver resolver = new CommonsMultip ...

  8. 微软拼音长句模式恢复工具支持Win10 1803

    4月份就有人留言旧微软拼音恢复工具不支持Win10 1803了,我自己也遇到了,但因为没时间搞,勉为其难使用了词组模式的微软拼音几个月,终于在八月份抽个空研究了下,解决了. 这次是因为傻逼大微软改了 ...

  9. Redis+Hbase+RocketMQ 实际使用问题案例分享

    需求 将Hbase数据,解析后推送到RocketMQ. redis使用list数据类型,存储了需要推送的数据的RowKey及表名. 简单画个流程图就是: 分析及确定方案 Redis 明确list中元素 ...

  10. Ubuntu snap 下载慢

    解决方法 sudo apt-get install snapd sudo snap install snap-store sudo snap install snap-store-proxy sudo ...