四种语言刷算法之 组合总和 II
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;
}
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;
}
};
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;
}
}
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的更多相关文章
- php四种基础排序算法的运行时间比较
/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...
- php四种基础排序算法的运行时间比较!
/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...
- SQL的四种语言和数据库范式
1. SQL的四种语言 DDL(Data Definition Language)数据库定义语言 CREATE ALTER DROP TRUNCATE COMMENT RENAME DML(Data ...
- PHP四种基本排序算法
PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数 ...
- 组合总和 II
组合总和 II 题目介绍 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...
- Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II)
Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II) 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使 ...
- Java实现 LeetCode 40 组合总和 II(二)
40. 组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在 ...
- 40. 组合总和 II + 递归 + 回溯 + 记录路径
40. 组合总和 II LeetCode_40 题目描述 题解分析 此题和 39. 组合总和 + 递归 + 回溯 + 存储路径很像,只不过题目修改了一下. 题解的关键是首先将候选数组进行排序,然后记录 ...
- 每个Java程序员都必须知道的四种负载均衡算法
前言 一般来说,我们在设计系统的时候,为了系统的高扩展性,会尽可能的创建无状态的系统,这样我们就可以采用集群的方式部署,最终很方便的根据需要动态增减服务器数量.但是,要使系统具有更好的可扩展性,除了无 ...
- LeetCode 中级 - 组合总和II(105)
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...
随机推荐
- plsql developer切换用户
方法1: 1.双击plsql developer桌面软件图标启动软件 2.在连接窗口中填写连接信息,连接数据库 3.在新建窗口下拉选项中,选择命令窗口功能 4.在工作区内会出现当前用户连接数据库的窗口 ...
- 基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序
前言 上一篇留的坑,火速补上. 在之前的第6篇中,已经有初步介绍,本文做一些补充,已经搞定这部分的同学可以快速跳过,基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列 ...
- js 获取当前时间转换时间戳 (毫秒)
js 当前时间转换毫秒数 五种方式 var date = new Date().getTime(); var date = new Date().valueOf(); var date = +ne ...
- 【转载】SQL SERVER 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- [seaborn] seaborn学习笔记9-绘图实例(1) Drawing example(1)
文章目录 9 绘图实例(1) Drawing example(1) 1. Anscombe's quartet(lmplot) 2. Color palette choices(barplot) 3. ...
- java中String类型的相关知识的简单总结
java中String类型的相关知识总结 一.常用方法: 1.构造方法: byte数组 可指定offset和length 可指定charset char数组 可指定offset和count 字符序列 ...
- s2-005
漏洞名称 (CVE-2010-1870) - XWork ParameterInterceptors旁路允许远程命令执行 利用条件 Struts 2.0.0 - Struts 2.1.8.1 漏洞原理 ...
- 通过Canal将云上MySQL数据同步到华为云ES(CSS)中
背景: A部门想将mysql中多张表join成一个sql查询语句,然后将结果同步到es中供搜索使用 环境信息: 源端mysql在阿里云上,有公网ip 目标端es在华为云上,三节点 操作步骤与目的: 配 ...
- 关于v-deep有你想知道的一切
1.首先要知道v-deep的使用场合. 在此之前先了解一下scoped属性,scoped 属性是一个布尔属性.如果使用该属性,则样式仅仅应用到 style 元素的父元素及其子元素. 在vue中引入了s ...
- Translent关键字-InvalidClassException异常_原理和解决方案
Translent关键字 static关键字:静态关键字静态优先于非静态加载到内存中(静态优先于对象进入到内存中)被static修饰的成员变量不能被序列化的,序列化的都是对象private stati ...