【算法习题】数组中任意2个(3个)数的和为sum的组合
题1、给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合
- @Test
- public void test_find2() {
- int[] arr = { -1, 0, 2, 3, 4, 7, 8, 9, 10 };
- int sum = 9;
- Arrays.sort(arr);
- List<TwoTuple<Integer, Integer>> result = new ArrayList<>();
- int i = 0;
- int j = arr.length - 1;
- while (i < j) {
- if (arr[i] + arr[j] == sum) {
- result.add(new TwoTuple<Integer, Integer>(arr[i], arr[j]));
- i++;
- j--;
- } else if (arr[i] + arr[j] < sum) {
- i++;
- } else { // > sum
- j--;
- }
- }
- System.out.println(result);
- } // out: [-1:10, 0:9, 2:7]
题2、给定一个int数组,一个数sum,求数组中和为sum的任意3个数的组合
- @Test
- public void test_find3() {
- int[] arr = { -1, 0, 2, 3, 4, 7, 8, 9, 10 };
- int sum = 9;
- Arrays.sort(arr);
- Set<ThreeTuple<Integer, Integer, Integer>> result = new LinkedHashSet<>();
- for (int i = 0; i < arr.length; i++) {
- int temp = arr[i];
- swap(arr, i, 0);
- int start = 1;
- int end = arr.length - 1;
- while (start < end) {
- if (arr[start] + arr[end] == sum - temp) {
- int[] threeNum = {temp, arr[start], arr[end]};
- Arrays.sort(threeNum);
- result.add(new ThreeTuple<>(threeNum[0], threeNum[1], threeNum[2]));
- start++;
- end--;
- } else if (arr[start] + arr[end] > sum - temp) {
- end--;
- } else {
- start++;
- }
- }
- swap(arr, i, 0); // 还原
- }
- System.out.println(result);
- } // out: [-1:0:10, -1:2:8, -1:3:7, 0:2:7, 2:3:4]
- private void swap(int[] a, int i, int j) {
- int temp = a[i];
- a[i] = a[j];
- a[j] = temp;
- }
上面两题用到的元组类:
- class TwoTuple<A, B> {
- public final A first;
- public final B second;
- public TwoTuple(A a, B b) {
- this.first = a;
- this.second = b;
- }
- @Override public String toString() {
- return first + ":" + second;
- }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((first == null) ? 0 : first.hashCode());
- result = prime * result + ((second == null) ? 0 : second.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- TwoTuple<?, ?> other = (TwoTuple<?, ?>) obj;
- if (first == null) {
- if (other.first != null)
- return false;
- } else if (!first.equals(other.first))
- return false;
- if (second == null) {
- if (other.second != null)
- return false;
- } else if (!second.equals(other.second))
- return false;
- return true;
- }
- }
TwoTuple<A, B>
- class ThreeTuple<A, B, C> extends TwoTuple<A, B> {
- public final C third;
- public ThreeTuple(A a, B b, C c) {
- super(a, b);
- this.third = c;
- }
- @Override public String toString() {
- return super.toString() + ":" + third;
- }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((third == null) ? 0 : third.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (!super.equals(obj))
- return false;
- if (getClass() != obj.getClass())
- return false;
- ThreeTuple<?, ?, ?> other = (ThreeTuple<?, ?, ?>) obj;
- if (third == null) {
- if (other.third != null)
- return false;
- } else if (!third.equals(other.third))
- return false;
- return true;
- }
- }
ThreeTuple<A, B, C>
题3、给定一个int正整数数组,一个数sum,求数组中和为sum的k个数的组合有多少种(k任意)。
另开一博客讨论这个问题。
指路:【算法习题】正整数数组中和为sum的任意个数的组合数——待完成
【算法习题】数组中任意2个(3个)数的和为sum的组合的更多相关文章
- 记录我对'我们有成熟的时间复杂度为O(n)的算法得到数组中任意第k大的数'的误解
这篇博客记录我对剑指offer第2版"面试题39:数组中出现次数超过一半的数字"题解1的一句话的一个小误解,以及汇总一下涉及partition算法的相关题目. 在剑指offer第2 ...
- 1145: 零起点学算法52——数组中删数II
1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: 293 ...
- 【剑指offer】找出数组中任意重复的数字(不修改数组),C++实现
原创博文,转载请注明出处! # 题目 在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但不能修改输入的数组.例如,如果输入长度 ...
- 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)
从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...
- python实现给定K个字符数组,从这k个字符数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合结果!
题目描述:给定K个字符数组,从这k个字符数组中任意取一个字符串,按顺序拼接,列出所有可能的字符串组合结果! 样例: input:[["a","b"," ...
- 偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。
今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2 ...
- [饭后算法系列] 数组中"和非负"的最长子数组
1. 问题 给定一列数字数组 a[n], 求这个数组中最长的 "和>=0" 的子数组. (注: "子数组"表示下标必须是连续的. 另一个概念"子 ...
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3
// test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 编程算法 - 数字数组中只出现一次 代码(C)
数字数组中只出现一次 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其它的数字都出现了两次. 请敲代码找出这 ...
随机推荐
- bootstrap框架下 单选按钮组的选中以及取值问题
1.业务功能:四个按钮只能选中一个,且默认选择水准4 先看代码. <div class="btn-group" data-toggle="buttons" ...
- ES6 —— 数组总结
1. map:映射 一个对一个 arr.map(function(item) { ... }) 可以配合箭头函数:arr.map(item => ... ) let arr1 = [1 ...
- navicat premium 安装破解(Mac & win)
1.windows请参考以下连接: https://www.jianshu.com/p/5f693b4c9468 2.mac安装教程 下载:http://www.pc6.com/mac/111878. ...
- git教程:工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...
- ros 使用笔记
1. publishers/subscribers 常用指令 说明rosnode list 查看所有激活的节点rostopic list 查看所有激活的topicrostopic i ...
- HD ACM 水题顺序
原文传送门:http://acm.hdu.edu.cn/ 第一阶段:开始入门吧!(15天,53题) 一.输入输出练习(2天,10题) 1000.1089-1096.1001 二.简单操作:(2-4天, ...
- python 测试登录接口只返回response200的问题
但是使用postman测试是有json串的 后来发现postman传参是用的raw格式,raw的格式相当于json 而这里的data其实是form-data格式,需要用json的格式
- 记录一次axios请求造成的数组初始化失败
axios请求是一个异步的请求,简单来讲就是在做其他事情的时候可以把这个先放一边等其他的事情做完后再来做这件事件. 我之前这样调用了一个方法: mounted() { this.first() thi ...
- vm12pro 安装winxp过程 记录1(涵个人问题)
1.百度的xp资源 选好iso文件后出现如下情景: 2.百度以后是要在一开始的首次界面就选择从哪个盘开始 3.选择了“Windowgs PE”选项…加载出界面后选择了ghost xp…现在…黑屏了…… ...
- SDL中 so库的使用
用到的项目:Tocy-Android-SDLv2 JAVA层:只有一个 SDLActivity.java 路径\Android-SDLv2\src\org\libsdl\app 项目简单分析: 默认在 ...