kSum问题总结
1、2Sum
题目:

方法一:两次迭代
public class TwoSum {
public static int[] twoSum(int[] nums, int target) {
int[] indices = {-1,-1};
for(int i=0; i<nums.length-1; i++ ){
if(target>=nums[i]){
for(int k=i+1; k<=nums.length-1; k++){
if(nums[k] == (target-nums[i])){
indices[0]=i;
indices[1]=k;
return indices;
}
}
}
}
return indices;
}
}
方法二:利用HashMap,减少一次迭代
import java.util.HashMap;
public class Two_Sum1 {
public static int[] twosum(int[] nums, int target){
int[] result = new int[2];
if(nums.length < 2) return result;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0; i<nums.length; i++){
if(!map.containsKey(target-nums[i])){
map.put(nums[i],i);
}else{
result[0]=map.get(target-nums[i]);
result[1]=i;
break;
}
}
return result;
}
}
2、3Sum

思路分析:数组排序 + twoPointers
public class _3Sum {
public static List<List<Integer>> threeSum(int[] num){
Arrays.sort(num);
List<List<Integer>> res = new LinkedList<>();
for(int i=0; i<num.length-2; i++){
if(i==0 || (i>0 && num[i]!= num[i-1])){
int lo=i+1, hi=num.length-1, sum=0-num[i];
while(lo<hi){
if(num[lo]+num[hi]==sum){
res.add(Arrays.asList(num[i],num[lo],num[hi]));
while(lo<hi && num[lo] == num[lo+1]) lo++;
while(lo<hi && num[hi] == num[hi-1]) hi--;
lo++; hi--;
}else if(num[lo]+num[hi]<sum) lo++;
else hi--;
}
}
}
return res;
}
}
3、3Sum Cloest

思路分析:数组排序 + twoPointers
public class _3SumClosest {
public static int threeSumClosest(int[] nums, int target){
Arrays.sort(nums);
int diff = Integer.MAX_VALUE, closest=0;
for(int i=0;i<nums.length-2;i++){
int lo=i+1, hi=nums.length-1;
while(lo<hi){
int sum = nums[i]+nums[lo]+nums[hi];
if(sum == target) return target;
else if(sum > target){
if(sum-target<diff){
diff = sum - target;
closest = sum;
}
hi--;
}else{
if(target-sum<diff){
diff = target - sum;
closest = sum;
}
lo++;
}
}
}
return closest;
}
}
4、4Sum

思路分析:数组排序+转化问题为3Sum + 2Sum
public class FourSum {
public static List<List<Integer>> fourSum(int[] nums, int target){
LinkedList<List<Integer>> res = new LinkedList<List<Integer>>();
if(nums==null || nums.length<4) return res;
Arrays.sort(nums);
int len = nums.length;
int max = nums[len-1];
if(4*nums[0]>target || 4*max<target) return res;
for(int i=0; i<len-3; i++){
int z=nums[i];
if(i>0 && z==nums[i-1]) continue;
if(z+3*max<target) continue;
if(4*z>target) break;
if(4*z==target) {
if(i+3<len && nums[i+3]==z) res.add(Arrays.asList(z,z,z,z));
break;
}
threeSum(nums,target-z,i+1,len-1,res,z);
}
return res;
}
public static void threeSum(int[] nums, int target, int lo, int hi, LinkedList<List<Integer>> fourSumList, int z1){
if(lo+1>=hi) return;
int max = nums[hi];
if(3*nums[lo]>target || 3*max<target) return;
for(int i=lo; i<hi-1; i++){
int z=nums[i];
if(i>lo && z==nums[i-1]) continue;
if(z+2*max<target) continue;
if(3*z>target) break;
if(3*z == target){
if(i+1<hi && nums[i+2]==z) fourSumList.add(Arrays.asList(z1,z,z,z));
break;
}
twoSum(nums,target-z,i+1,hi,fourSumList,z1,z);
}
}
public static void twoSum(int[] nums, int target, int lo, int hi, LinkedList<List<Integer>> fourSumList, int z1, int z2){
if(lo>=hi) return;
if(2*nums[lo]>target || 2*nums[hi]<target) return;
while(lo<hi){
int sum = nums[lo]+nums[hi];
if(sum == target){
fourSumList.add(Arrays.asList(z1,z2,nums[lo],nums[hi]));
while(lo<hi && nums[lo]==nums[lo+1]) lo++;
while(lo<hi && nums[hi]==nums[hi-1]) hi--;
lo++;hi--;
}
if(sum<target) lo++;
if(sum>target) hi--;
}
return;
}
}
5、kSum
public class KSum {
public ArrayList<List<Integer>> kSum(int[] nums, int target, int k, int index){
ArrayList<List<Integer>> res = new ArrayList<List<Integer>>();
if(nums==null || nums.length<k) return res;
Arrays.sort(nums);
int len = nums.length;
int max = nums[len-1];
if(k*nums[0]>target || k*max<target) {
return res;
}
if(index >= len) {
return res;
}
if(k==2){
int i=index, j=len-1;
while(i<j){
if(nums[i]+nums[j] == target){
res.add(Arrays.asList(nums[i],nums[j]));
while(i<j && nums[i]==nums[i+1]) i++;
while(i<j && nums[j]==nums[j-1]) j--;
i++;j--;
} else if(nums[i]+nums[j]<target) i++;
else j--;
} //while循环结束
}else{
for (int i = index; i < len - k + 1; i++) {
ArrayList<List<Integer>> temp = kSum(nums,target-nums[i],k-1,i+1);
if(temp!=null && temp.size()!=0){
for(List<Integer> t : temp){
t.add(0,nums[i]);
}
res.addAll(temp);
}
while(i<len-1 && nums[i] == nums[i+1]){
i++;
}
}//for循环结束
}
return res;
}
}
kSum问题总结的更多相关文章
- 2016 一中培训 day 5 ksum
又是一天的爆零!!!!! 原本第一题 很容易做 竟然优化过度 丢了答案 1693: ksum Time Limit 1000 ms Memory Limit 524288 KBytes Judge S ...
- 2Sum,3Sum,4Sum,kSum,3Sum Closest系列
1).2sum 1.题意:找出数组中和为target的所有数对 2.思路:排序数组,然后用两个指针i.j,一前一后,计算两个指针所指内容的和与target的关系,如果小于target,i右移,如果大于 ...
- 2sum,3sum,4sum,ksum
1. 2sum 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...
- 【数组】kSum问题
一.2Sum 思路1: 首先对数组排序.不过由于最后返回两个数字的索引,所以需要事先对数据进行备份.然后采用2个指针l和r,分别从左端和右端向中间运动:当l和r位置的两个数字之和小于目标数字targe ...
- k-sum 问题
问题描述 给定一个数组及数字 k ,从数组中找出所有相加结果为 k 的组合. 示例: 给定数组 [1,1,1] 令 k=2,输出: [[1,1]] 给定数组 [10, 1, 2, 7, 6, 1, 5 ...
- [算法]K-SUM problem
一.Two Sum Given an array of integers, find two numbers such that they add up to a specific target nu ...
- 【JZOJ4815】【NOIP2016提高A组五校联考4】ksum
题目描述 输入 输出 样例输入 3 4 1 3 4 样例输出 8 7 4 4 数据范围 样例解释 解法 二分做法 考虑到可以二分第k大的值mid,如果比mid大的区间和数小于或等于mid,那么mid就 ...
- k-sum问题
给定一个数组,里面的是任意整数,可能有重复,再给定一个目标T,从数组中找出所有和为T的K个数,要求结果中没有重复. Note: Elements in a quadruplet (a,b,c,d) m ...
- ksum问题
2sum: Given an array of integers, return indices of the two numbers such that they add up to a speci ...
随机推荐
- 数据结构树之AVL树(平衡二叉树)
一 什么是AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节 ...
- Checked Uncheckd异常
Checked : 你可以在写代码的时候就throw 或者try catch 的 Unchecked : Error + RuntimeException .提前无法预测的 http://www ...
- 《笨方法学Python》加分题20
加分练习通读脚本,在每一行之前加注解,以理解脚本里发生的事情.每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量,在每次调用时,打印出 current_line ...
- 算法 BF算法
BF算法是字符匹配的一种算法,也称暴力匹配算法 算法思想: 从主串s1的pos位置出发,与子串s2第一位进行匹配 若相等,接着匹配后一位字符 若不相等,则返回到s1前一次匹配位置的后一位,接着与s2的 ...
- 干货 | 10分钟玩转PWA
关于PWA PWA(Progressive Web App), 即渐进式web应用.PWA本质上是web应用,目的是通过多项新技术,在安全.性能.体验等方面给用户原生应用的体验.而且无需像原生应用那样 ...
- 某app的安全性分析过程
交互过程如下,可以发现问题很多 http://www.ixxxx.com//api/index/app图片验证码:{"data":{"imgCode":&quo ...
- memcache集群
实现memcache集群 一:memcache本身没有redis锁具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群的方式,让各memcache的数据进行同步,实现数据的一致性,即 ...
- 移动端常见bug
meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...
- tomcat与iis公用80端口(已经发布.net项目现在开发Java项目时tomcat在eclipse中localhost:8080打不开问题)
在开发过.net项目的电脑上安装eclipse配置tomcat运行时打不开页面问题描述,这也是本人亲生经历,找了好多资料网上大多都是tomcat配置问题描述,今天突然想到是不是IIS的问题,果然上网一 ...
- 复习支持向量机(SVM)没空看书时,掌握下面的知识就够了
支持向量机(support vector machines, SVM)是一种二类分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器:支持向量机还包括核技巧,这使它成为实质上的非线性分类器. ...